mmanos/laravel-taggable

Laravel 4 模型标签包。

v1.0.1 2015-07-06 13:37 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:31:09 UTC


README

此包为您的Laravel应用程序添加了标签支持。您可以根据需要配置它将标签附加到现有的Eloquent模型上。

安装

Composer

将此添加到您的composer.json文件中,在require对象中

"mmanos/laravel-taggable": "dev-master"

之后,运行composer install以安装此包。

服务提供者

在您的app配置文件中注册Mmanos\Taggable\TaggableServiceProvider

配置

标签迁移和模型

首先,您需要发布一个tags表和一个Tag模型。此表将保存由您的可标签模型创建的所有标签的摘要。

$ php artisan laravel-taggable:tags tags

注意:修改此调用的最后一个参数以更改表/模型名称。

注意:如果您需要将标签分别保存在不同类型的内容中,例如,可以发布任意数量的标签表。

可标签迁移

接下来,为要标记的每种内容发布一个迁移。您可以根据需要标记任意类型的内容。例如,如果您想能够标记users表和blog_posts表,则为每个表运行此迁移一次。

$ php artisan laravel-taggable:taggable user_tags

运行迁移

创建迁移后,只需运行migrate命令。

模型设置

接下来,将Taggable特质添加到每个可标签模型定义中

use Mmanos\Taggable\Taggable;

class User extends Eloquent
{
	use Taggable;
}

然后,您需要指定要使用与您的模型一起使用的标签模型以及可标签表

class User extends Eloquent
{
	protected $tag_model = 'Tag';
	protected $taggable_table = 'user_tags';
}

同步自定义属性

有时您可能希望将内容表中的一些相同字段同步到可标签表记录中。这将允许您在查询可标签表时按这些属性进行筛选和排序。幸运的是,此系统将在您定义的任何字段更改时自动将任何字段同步到可标签表记录。

要开始,请修改taggable迁移文件,以包含您附加的字段。

然后,告诉您的模型需要同步哪些字段

class User extends Eloquent
{
	protected $taggable_table_sync = ['company_id', 'created_at', 'updated_at', 'deleted_at'];
}

现在,每次创建或更新模型时,这些字段都将同步到该内容的所有可标签表记录。

同步已删除的内容

当删除某个内容时,此包将自动删除所有与该内容相关的可标签表记录。

如果您正在使用SoftDeletingTrait并将deleted_at列同步到您的可标签表记录中,当删除该内容时,此包将自动软删除与该内容相关的所有可标签表记录。如果内容被恢复,则可标签表记录也将被恢复。

与标签一起工作

标记内容

要向现有内容添加标签

$user->tag('Frequent Visitor');

或一次添加多个标签

$user->tag('Frequent Visitor', 'Happy');
// or
$user->tag(['Frequent Visitor', 'Happy']);

注意:如果内容已有一个标签,则不会再次添加,也不会抛出错误。

删除标签

同样,您可以删除现有内容中的标签

$user->untag('Frequent Visitor');

或一次删除多个标签

$user->untag('Frequent Visitor', 'Happy');
// or
$user->untag(['Frequent Visitor', 'Happy']);

注意:如果内容没有请求的标签,则系统不会抛出错误。

检查标签

要查看内容是否有标签

if ($user->hasTag('Frequent Visitor')) {
	
}

检索所有标签

要获取与内容关联的所有标签,请使用tags关系

$tags = $user->tags;

检索所有标签的数组

要获取与某个内容关联的所有标签并将它们作为数组返回,请使用 tagsArray 方法

$tags = $user->tagsArray();

查询带标签的内容

执行查询

现在假设您要查询所有包含指定标签的内容

$users = User::withTag('Frequent Visitor')->take(10)->get();

这些查询扩展了您熟悉的 QueryBuilder 类,所以所有这些方法也可以正常使用

$users = User::withTag('Frequent Visitor')
	->where('tag_created_at', '>', '2015-01-01 00:00:00')
	->with('company')
	->orderBy('tag_created_at', 'desc')
	->paginate(10);

注意:在 QueryBuilder 对象上的 updatedelete 方法不适用于这些查询。

您可以查询包含多个标签的内容

$users = User::withTag('Frequent Visitor', 'Happy')->get();
// or
$users = User::withTag(['Frequent Visitor', 'Happy'])->get();

您还可以查询包含给定标签中的任何一个标签的内容

$users = User::withAnyTag('Frequent Visitor', 'Happy')->get();
// or
$users = User::withAnyTag(['Frequent Visitor', 'Happy'])->get();

注意:如果您的查询匹配了数千条或更多的记录,这些类型查询的查询性能可能会降低。

您还可以组合多个过滤器

// Fetch all users who have the 'Agent' tag and who have 'Frequent Visitor' or 'Happy'.
$users = User::withTag('Agent')->withAnyTag('Frequent Visitor', 'Happy')->get();

标签上下文

有时您可能想将您的标签(摘要表)记录与您的应用程序的一些自定义上下文相关联。例如,假设您有一个 companies 表和一个 users 表,每个用户属于一个公司。现在您还想要将每个标签记录与一个公司关联,以便您可以获取每个单独公司使用的所有标签。为了做到这一点,我们必须告诉这个包意识到这个公司上下文,并相应地修改它的查询。

要开始,请确保您修改了您的标签迁移,以包含任何上下文字段(在这个例子中是 company_id)。如果需要,您可能还需要更新唯一索引。

然后通过添加 tagContext 方法来修改您的可标记模型

class User extends Eloquent
{
	public function tagContext()
	{
		return $this->company;
	}
}

接下来修改您的 Tag 模型(或者您在配置期间指定的任何名称)以应用任何上下文

class Tag extends Eloquent
{
	public static function applyQueryContext($query, $context)
	{
		$query->where('company_id', $context->id);
	}
	
	public static function applyModelContext($model, $context)
	{
		$model->company_id = $context->id;
	}
}

applyQueryContext 方法将调整此包使用的任何标签查询以过滤 company_id

当创建新的 Tag 记录时,会调用 applyModelContext 方法,并应设置任何所需的上下文字段。

最后,在执行查询时,指定要应用的上下文

$users = User::withTag('Frequent Visitor')->withTagContext($company)->take(10)->get();