Eloquent-Taggable 为你的 Laravel 应用

2023-02-26  本文已影响0人  大萝卜2022

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 插件一样简单方便,这才是开发的未来.

上一篇下一篇

猜你喜欢

热点阅读