Eloquent-Taggable 提供了简便的方法为 Laravel 的 Eloquent 模型添加 标签功能.
数据模型的标签功能,属于应用开发中的常见功能,利用 Eloquent 的高扩展性和 PHP 5.4 的 Trait 功能,Eloquent-Taggable 允许开发者只需要通过简单的配置,就能为 例如 Article 模型打标签.
标签的逻辑
这里以为博客文章加上标签功能为例:
一篇文章对应多个标签;
可以通过单个标签对此标签下的文章进行列表;
标签需要去重;
编辑文章重新指定标签时,需要解除与老标签的关系,添加新标签;
安装
- 编辑 composer.json , 添加
"cviebrock/eloquent-taggable": "0.*"
- 编辑 app.php 添加 providers
'Cviebrock\EloquentTaggable\TaggableServiceProvider',
- 数据库 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) 功能,见文档.
- 发布配置信息
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 插件一样简单方便,这才是开发的未来.
网友评论