美文网首页
Eloquent-Taggable 为你的 Laravel 应用

Eloquent-Taggable 为你的 Laravel 应用

作者: 大萝卜2022 | 来源:发表于2023-02-26 14:33 被阅读0次

    Eloquent-Taggable 提供了简便的方法为 Laravel 的 Eloquent 模型添加 标签功能.

    数据模型的标签功能,属于应用开发中的常见功能,利用 Eloquent 的高扩展性和 PHP 5.4 的 Trait 功能,Eloquent-Taggable 允许开发者只需要通过简单的配置,就能为 例如 Article 模型打标签.
    标签的逻辑

    这里以为博客文章加上标签功能为例:

    一篇文章对应多个标签;
    可以通过单个标签对此标签下的文章进行列表;
    标签需要去重;
    编辑文章重新指定标签时,需要解除与老标签的关系,添加新标签;
    

    安装

    1. 编辑 composer.json , 添加
    "cviebrock/eloquent-taggable": "0.*"
    
    1. 编辑 app.php 添加 providers
    'Cviebrock\EloquentTaggable\TaggableServiceProvider',
    
    1. 数据库 migration
    php artisan migrate --package=cviebrock/eloquent-taggable
    

    上面命令会两张表 源代码在此:

    Schema::create('taggable_tags', function(Blueprint $table)
    {
      $table->increments('id');
      $table->string('name');
      $table->string('normalized');
      $table->timestamps();
    });
    Schema::create('taggable_taggables', function(Blueprint $table)
    {
      $table->integer('tag_id');
      $table->integer('taggable_id')->unsigned()->index();
      $table->string('taggable_type');
      $table->timestamps();
    });
    
    taggable_tags 表为标签数据表;
    taggable_taggables 对应表
    
    从 taggable_taggables 表结构可以看出是利用了 Eloquent ORM 的 多态对应关系 (Polymorphic Relations) 功能,见文档.
    
    1. 发布配置信息
    php artisan config:publish cviebrock/eloquent-taggable
    

    主要有以下两个选项

    return array(
         // 数组分隔符
        'delimiters' => ',;',
    
        // 针对 taggable_tags 表中 normalized 字段的处理
        // 此字段用作一个标签在数据库里的唯一标识符, 可以当 URL Slug 使用
        'normalizer' => 'mb_strtolower',
    );
    

    集成
    编辑现有的 Eloquent Models 模型

    use Cviebrock\EloquentTaggable\Taggable;
    use Cviebrock\EloquentTaggable\TaggableImpl;
    
    class MyModel extends Eloquent implements Taggable
    {
        use TaggableImpl;
    }
    

    配置完成,接下来就是使用咯.
    使用 Taggable
    创建标签

    // 可以通过传参分号间隔的字串
    $model->tag('Apple,Banana,Cherry');
    
    // 也可以通过传参数组
    $model->tag(['Apple', 'Banana', 'Cherry']); 
    
    // 也可以一个个添加
    $model->tag('Apple');
    $model->tag('Banana');
    $model->tag('Cherry'); 
    
    去除标签
    
    // 当独接触一个标签
    $model->untag('Banana');
    
    // 解除全部标签
    $model->detag();
    

    重新打标签 (适合在用户编辑文章提交后使用)

    // 去除原有的标签, 然后重新打上传参的标签
    $model->retag('Etrog,Fig,Grape');
    

    读取 Model 对应的标签

    //  Eloquent Collection 的格式取出
    foreach($model->tags as $tag)
    {
        echo $tag->name;
    }
    
    // string 'Apple,Banana,Cherry' (length=19)
    $model->tagList
    
    // array (size=3)
    //  1 => string 'Apple' (length=5)
    //  2 => string 'Banana' (length=6)
    //  3 => string 'Cherry' (length=6)
    $model->tagArray
    

    读取标签对应的 Model

    // 打了以下全部标签的文章
    Model::withAllTags('apple,banana,cherry');
    
    // 打了以下其中一个标签的文章
    Model::withAnyTags('apple,banana,cherry');
    
    // 返回有打过标签的文章
    Model::withAnyTags();
    

    总结

    Laravel-Blog 项目里博客标签功能就是使用此扩展包进行开发的,可供 参考.

    Laravel 的强大在这个扩展中充分体现,想想看,应用里某个功能实现就如 Wordpress 插件一样简单方便,这才是开发的未来.

    相关文章

      网友评论

          本文标题:Eloquent-Taggable 为你的 Laravel 应用

          本文链接:https://www.haomeiwen.com/subject/embakdtx.html