ホームページ >バックエンド開発 >PHPチュートリアル >Laravel Taggedable はモデルにタグ付け機能を追加します

Laravel Taggedable はモデルにタグ付け機能を追加します

WBOY
WBOYオリジナル
2016-06-20 12:28:421710ブラウズ

関数の説明

最も簡単な方法を使用して、データ モデルに強力な「ラベル付け」関数を提供します。

:gift: プロジェクトのアドレス: https://github.com/Summerblue/laravel-taggable

このプロジェクトは rtconner/laravel-tagging プロジェクトから変更され、いくつかの機能が追加されています:

  • タグ名は一意です。
  • タグが無制限のレベルのタグのネストをサポートできるように、etrepat/baum 依存関係を追加します。
  • 中国語のスラッグ ピンインが自動的に生成され、サポートされます。 overtrue/pinyin については Brother Chao に感謝します。
  • コードの品質を保証するための完全なテスト ケースを提供します。

注: このプロジェクトは 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 を確認してください。

タグ名ルールの説明

  • タグ名の特殊記号とスペースは - に置き換えられます。
  • スマート タグのスラッグ生成により、対応する中国語のピンインが生成されます。名前スラッグ (tag->biao-qian など)、ピンインが同じ場合、ランダムな値が追加されます。

タグ名をクリーンアップするには、次を使用します。 $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 の作成

必須ではありませんが、プロジェクトに固有の 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 クラスで発生します。カスタマイズ機能をさらに強化するには、独自の 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

ありがとう

  • 特別な感謝: Robert Conner - http://smartersoftware.net
  • overtrue / ピンイン
  • エトレパット/バウム
  • EST グループが愛を込めて作成 - http://estgroupe.com/
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。