Laravel Taggable 为你的模型添加打标签功能
功能说明
使用最简便的方式,为你的数据模型提供强大「打标签」功能。
:gift: 项目地址: https://github.com/summerblue/laravel-taggable
本项目修改于 rtconner/laravel-tagging项目,增加了一下功能:
- 标签名唯一;
- 增加 etrepat/baum依赖,让标签支持无限级别标签嵌套;
- 中文 slug 拼音自动生成支持,感谢超哥的 overtrue/pinyin;
- 提供完整的测试用例,保证代码质量。
注意: 本项目只支持 5.1 LTS
:heart: 此项目由 The EST Group团队的 @Summer维护。
无限级别标签嵌套
集成 etrepat/baum让标签具备从属关系。
$root = Tag::create(['name' => 'Root']);// 创建子标签$child1 = $root->children()->create(['name' => 'Child1']);$child = Tag::create(['name' => 'Child2']);$child->makeChildOf($root);// 批量构建树$tagTree = [ 'name' => 'RootTag', 'children' => [ ['name' => 'L1Child1', 'children' => [ ['name' => 'L2Child1'], ['name' => 'L2Child1'], ['name' => 'L2Child1'], ] ], ['name' => 'L1Child2'], ['name' => 'L1Child3'], ]];Tag::buildTree($tagTree);
更多关联操作请查看: etrepat/baum。
标签名称规则说明
- 标签名里的特殊符号和空格会被 -替代;
- 智能标签 slug 生成,会生成 name 对应的中文拼音 slug ,如: 标签-> biao-qian,拼音一样的时候会被加上随机值;
标签名清理使用: $normalize_string = EstGroupe\Taggable\Util::tagName($name)。
Tag::create(['标签名']);// name: 标签名// slug: biao-qian-mingTag::create(['表签名']);// name: 表签名// slug: biao-qian-ming-3243 (后面 3243 为随机,解决拼音冲突)Tag::create(['标签 名']);// name: 标签-名// slug: biao-qian-mingTag::create(['标签!名']);// name: 标签-名// slug: biao-qian-ming
安装说明:
安装
composer require estgroupe/laravel-taggable "5.1.*"
安装和执行迁移
在 config/app.php的 providers数组中加入:
'providers' => array( \EstGroupe\Taggable\Providers\TaggingServiceProvider::class,);
php artisan vendor:publish --provider="EstGroupe\Taggable\Providers\TaggingServiceProvider"php artisan migrate
请仔细阅读 config/tagging.php文件。
创建 Tag.php
不是必须的,不过建议你创建自己项目专属的 Tag.php 文件。
<?php namespace App\Models;use EstGroupe\Taggable\Model\Tag as TaggableTag;class Tag extends TaggableTag{ // Model code go here}
修改 config/tagging.php文件中:
'tag_model'=>'\App\Models\Tag',
加入 Taggable Trait
<?php namespace App\Models;use Illuminate\Database\Eloquent\Model;use EstGroupe\Taggable\Taggable;class Article extends \Illuminate\Database\Eloquent\Model { use Taggable;}
「标签状态」标示
Taggable能跟踪模型是否打过标签的状态:
// `no`$article->is_tagged// `yes`$article->tag('Tag1');$article->is_tagged;// `no`$article->unTag();$article->is_tagged// This is fast$taggedArticles = Article::where('is_tagged', 'yes')->get()
首先你需要修改 config/tagging.php文件中:
'is_tagged_label_enable' => true,
然后在你的模型的数据库创建脚本里加上:
<?phpuse Illuminate\Database\Schema\Blueprint;use Illuminate\Database\Migrations\Migration;class CreateArticlesTable extends Migration { public function up() { Schema::create('weibo_statuses', function(Blueprint $table) { $table->increments('id'); ... // Add this line $table->enum('is_tagged', array('yes', 'no'))->default('no'); ... $table->timestamps(); }); }}
「推荐标签」标示
方便你实现「推荐标签」功能,只需要把 suggest字段标示为 true:
$tag = EstGroupe\Taggable\Model\Tag::where('slug', '=', 'blog')->first();$tag->suggest = true;$tag->save();
即可以用以下方法读取:
$suggestedTags = EstGroupe\Taggable\Model\Tag::suggested()->get();
重写 Util 类?
大部分的通用操作都发生在 Util 类,你想获取更多的定制权力,请创建自己的 Util 类,并注册服务提供者:
namespace My\Project\Providers;use EstGroupe\Taggable\Providers\TaggingServiceProvider as ServiceProvider;use EstGroupe\Taggable\Contracts\TaggingUtility;class TaggingServiceProvider extends ServiceProvider { /** * Register the service provider. * * @return void */ public function register() { $this->app->singleton(TaggingUtility::class, function () { return new MyNewUtilClass; }); }}
然后在
注意 MyNewUtilClass必须实现 EstGroupe\Taggable\Contracts\TaggingUtility接口。
使用范例
$article = Article::with('tags')->first(); // eager load// 获取所有标签foreach($article->tags as $tag) { echo $tag->name . ' with url slug of ' . $tag->slug;}// 打标签$article->tag('Gardening'); // attach the tag$article->tag('Gardening, Floral'); // attach the tag$article->tag(['Gardening', 'Floral']); // attach the tag$article->tag('Gardening', 'Floral'); // attach the tag// 批量通过 tag ids 打标签$article->tagWithTagIds([1,2,3]);// 去掉标签$article->untag('Cooking'); // remove Cooking tag$article->untag(); // remove all tags// 重打标签$article->retag(['Fruit', 'Fish']); // delete current tags and save new tags$article->retag('Fruit', 'Fish');$article->retag('Fruit, Fish');$tagged = $article->tagged; // return Collection of rows tagged to article$tags = $article->tags; // return Collection the actual tags (is slower than using tagged)// 获取绑定的标签名称数组$article->tagNames(); // get array of related tag names// 获取打了「任意」标签的 Article 对象Article::withAnyTag('Gardening, Cooking')->get(); // fetch articles with any tag listedArticle::withAnyTag(['Gardening','Cooking'])->get(); // different syntax, same result as aboveArticle::withAnyTag('Gardening','Cooking')->get(); // different syntax, same result as above// 获取打了「全包含」标签的 Article 对象Article::withAllTags('Gardening, Cooking')->get(); // only fetch articles with all the tagsArticle::withAllTags(['Gardening', 'Cooking'])->get();Article::withAllTags('Gardening', 'Cooking')->get();EstGroupe\Taggable\Model\Tag::where('count', '>', 2)->get(); // return all tags used more than twiceArticle::existingTags(); // return collection of all existing tags on any articles
如果你,即可使用以下标签读取功能:
// 通过 slug 获取标签Tag::byTagSlug('biao-qian-ming')->first();// 通过名字获取标签Tag::byTagName('标签名')->first();// 通过名字数组获取标签数组Tag::byTagNames(['标签名', '标签2', '标签3'])->first();// 通过 Tag ids 数组获取标签数组Tag::byTagIds([1,2,3])->first();// 通过名字数组获取 ID 数组$ids = Tag::idsByNames(['标签名', '标签2', '标签3'])->all();// [1,2,3]
标签事件
Taggabletrait 提供以下两个事件:
EstGroupe\Taggable\Events\TagAdded;EstGroupe\Taggable\Events\TagRemoved;
监听标签事件:
\Event::listen(EstGroupe\Taggable\Events\TagAdded::class, function($article){ \Log::debug($article->title . ' was tagged');});
单元测试
基本用例测试请见: tests/CommonUsageTest.php。
运行测试:
composer installvendor/bin/phpunit --verbose
Thanks
- Special Thanks to: Robert Conner - http://smartersoftware.net
- overtrue/pinyin
- etrepat/baum
- Made with love by The EST Group - http://estgroupe.com/

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...
