Eloquent-Taggable 为你的 Laravel 应用添加标签功能

说明

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

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

标签的逻辑

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

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

安装

1. 编辑 composer.json , 添加

"cviebrock/eloquent-taggable": "0.*"

2. 编辑 app.php 添加 providers

'Cviebrock\EloquentTaggable\TaggableServiceProvider',

3. 数据库 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) 功能, 见文档.

4. 发布配置信息

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

整个应用由多个模块拼接起来, 大家都把精力放在维护这些通用模块上, 利用 社区 的力量来一起维护, 极大提高了开发效率, 解放生产力, 把精力更多放在 产品功能上, Build Great Product. :beers:

摈弃世俗浮躁,追求技术精湛
本帖已被设为精华帖!
Summer
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!