ホームページ >バックエンド開発 >PHPチュートリアル >Laravel Taggedable はモデルにタグ付け機能を追加します
最も簡単な方法を使用して、データ モデルに強力な「ラベル付け」関数を提供します。
:gift: プロジェクトのアドレス: https://github.com/Summerblue/laravel-taggable
このプロジェクトは rtconner/laravel-tagging プロジェクトから変更され、いくつかの機能が追加されています:
注: このプロジェクトは 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 を確認してください。
タグ名をクリーンアップするには、次を使用します。 $normalize_string = EstGroupeTaggableUtil::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' => array( \EstGroupe\Taggable\Providers\TaggingServiceProvider::class,);
php artisan vendor:publish --provider="EstGroupe\Taggable\Providers\TaggingServiceProvider"php artisan migrate
config/tagging.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',
<?php namespace App\Models;use Illuminate\Database\Eloquent\Model;use EstGroupe\Taggable\Taggable;class Article extends \Illuminate\Database\Eloquent\Model { use 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(); }); }}
をマークすると、「推奨タグ」機能の実装が容易になります。提案フィールドを true としてマークするだけです:
$tag = EstGroupe\Taggable\Model\Tag::where('slug', '=', 'blog')->first();$tag->suggest = true;$tag->save();
つまり、次のメソッドで読み取ることができます:
$suggestedTags = EstGroupe\Taggable\Model\Tag::suggested()->get();
取得したい場合、最も一般的な操作は 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 が EstGroupeTaggableContractsTaggingUtility インターフェイスを実装する必要があることに注意してください。
$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次の 2 つのイベントが提供されています:
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