kmjtrue/laravel-tags
Rinvex Tags 是一个多态 Laravel 扩展包,用于标签管理。您可以轻松地对任何 eloquent 模型进行标签化,并利用 Sluggable 和 Translatable 模型的强大功能。
Requires
- kjmtrue/laravel-cacheable: ^4.1
- kjmtrue/laravel-support: ^4.1
- spatie/eloquent-sortable: ^3.7.0
- spatie/laravel-sluggable: ^2.2.0
- spatie/laravel-translatable: ^4.2.0
Requires (Dev)
- codedungeon/phpunit-result-printer: ^0.27.0
- illuminate/container: ^7.0.0
- phpunit/phpunit: ^9.0.0
README
Rinvex Tags 是一个多态 Laravel 扩展包,用于标签管理。您可以轻松地对任何 eloquent 模型进行标签化,并利用 Sluggable 和 Translatable 模型的强大功能。
安装
-
通过 composer 安装包
composer require rinvex/laravel-tags
-
发布资源(迁移和配置文件)
php artisan rinvex:publish:tags
-
使用以下命令执行迁移
php artisan rinvex:migrate:tags
-
完成!
用法
要将标签支持添加到您的 eloquent 模型,只需使用 \Rinvex\Tags\Traits\Taggable
特性。
管理您的标签
您的标签只是普通的 eloquent 模型,因此您可以像这样处理它。为您的方便,标签模型还增加了几个方法,让我们看看
// Create new tag by name app('rinvex.tags.tag')->createByName('My New Tag'); // Create new tag by name, group, and translation app('rinvex.tags.tag')->createByName('The very new tag', 'blog', 'en'); // Find first tag by name app('rinvex.tags.tag')->firstByName('My New Tag'); // Find first tag by name, group, and translation app('rinvex.tags.tag')->firstByName('وسم جديد', 'board', 'ar'); // Find tag(s) by name app('rinvex.tags.tag')->findByName('My New Tag'); // Find tag(s) by name, group, and translation app('rinvex.tags.tag')->findByName('وسم جديد', 'board', 'ar'); // Find multiple tags by names array app('rinvex.tags.tag')->findByName(['Tag One', 'Tag Two']); // Find multiple tags by delimited names (tag delimiter is customizable) app('rinvex.tags.tag')->findByName('First Tag, Second Tag, Third Tag'); // Find tag(s) by name or create if not exists app('rinvex.tags.tag')->findByNameOrCreate('My Brand New Tag'); // Find tag(s) by name, group, and translation or create if not exists app('rinvex.tags.tag')->findByNameOrCreate(['My Brand New Tag 2', 'My Brand New Tag 3']);
注意
- Rinvex Tags 扩展并利用其他优秀的包,使用
spatie/laravel-translatable
实现开箱即用的可翻译性,并使用spatie/laravel-sluggable
包实现自动 Slugging。了解一下。findByName()
和findByNameOrCreate()
方法接受一个或多个标签作为第一个参数,并始终返回一个集合。
管理您的可标签化模型
API 直观且非常直接,所以让我们快速看看
// Get instance of your model $post = new \App\Models\Post::find(1); // Get attached tags collection $post->tags; // Get attached tags query builder $post->tags();
您可以通过多种方式添加标签
// Single tag id $post->attachTags(1); // Multiple tag IDs array $post->attachTags([1, 2, 5]); // Multiple tag IDs collection $post->attachTags(collect([1, 2, 5])); // Single tag model instance $tagInstance = app('rinvex.tags.tag')->first(); $post->attachTags($tagInstance); // Single tag name (created if not exists) $post->attachTags('A very new tag'); // Multiple delimited tag names (use existing, create not existing) $post->attachTags('First Tag, Second Tag, Third Tag'); // Multiple tag names array (use existing, create not existing) $post->attachTags(['First Tag', 'Second Tag']); // Multiple tag names collection (use existing, create not existing) $post->attachTags(collect(['First Tag', 'Second Tag'])); // Multiple tag model instances $tagInstances = app('rinvex.tags.tag')->whereIn('id', [1, 2, 5])->get(); $post->attachTags($tagInstances);
注意
attachTags()
方法将给定的标签附加到模型,而不会触及当前附加的标签,而syncTags()
方法可以断开与给定项不在其中的任何记录的连接,此方法接受一个可选的布尔参数,将其设置为true
或false
以设置断开标志。- 要断开模型标签,您可以使用
detachTags()
方法,它使用与attachTags()
方法完全相同的签名,并具有通过将 null 或空值传递给该方法来断开所有当前附加标签的功能:$post->detachTags();
。- 您可能有多个具有相同名称和相同语言的标签,在这种情况下,默认使用第一个找到的记录。这是有意为之,以确保跨所有功能的一致行为,无论您是在附加、断开连接还是范围化模型标签。
正如您可能预期的,您可以检查是否附加了标签
// Single tag id $post->hasAnyTags(1); // Multiple tag IDs array $post->hasAnyTags([1, 2, 5]); // Multiple tag IDs collection $post->hasAnyTags(collect([1, 2, 5])); // Single tag model instance $tagInstance = app('rinvex.tags.tag')->first(); $post->hasAnyTags($tagInstance); // Single tag name $post->hasAnyTags('A very new tag'); // Multiple delimited tag names $post->hasAnyTags('First Tag, Second Tag, Third Tag'); // Multiple tag names array $post->hasAnyTags(['First Tag', 'Second Tag']); // Multiple tag names collection $post->hasAnyTags(collect(['First Tag', 'Second Tag'])); // Multiple tag model instances $tagInstances = app('rinvex.tags.tag')->whereIn('id', [1, 2, 5])->get(); $post->hasAnyTags($tagInstances);
注意
hasAnyTags()
方法检查给定的任何标签是否附加到模型。它返回布尔值true
或false
。- 同样,
hasAllTags()
方法使用与hasAnyTags()
方法完全相同的签名,但行为不同,它执行严格的比较以检查是否所有给定的标签都附加了。
高级用法
生成标签别名
Rinvex Tags 自动生成别名并自动检测并为您插入默认翻译(如果未提供),但您仍然可以通过常规 eloquent create
方法显式传递它,如下所示
app('rinvex.tags.tag')->create(['name' => ['en' => 'My New Tag'], 'slug' => 'custom-tag-slug']);
注意:有关详细信息,请参阅 Sluggable 包。
智能参数检测
雷文克斯标签 方法可以接收标签列表,足够智能,能够处理几乎所有类型的输入,如上例所示。它会检查输入类型并相应地处理。
检索所有与标签关联的模型
您可能会遇到需要获取特定标签关联的所有模型的情况,您可以轻松地按以下方式操作
$tag = app('rinvex.tags.tag')->find(1); $tag->entries(\App\Models\Post::class)->get();
查询范围
是的,雷文克斯标签附带了一些方便的查询范围,以下是使用示例
// Single tag id $post->withAnyTags(1)->get(); // Multiple tag IDs array $post->withAnyTags([1, 2, 5])->get(); // Multiple tag IDs collection $post->withAnyTags(collect([1, 2, 5]))->get(); // Single tag model instance $tagInstance = app('rinvex.tags.tag')->first(); $post->withAnyTags($tagInstance)->get(); // Single tag name $post->withAnyTags('A very new tag')->get(); // Multiple delimited tag names $post->withAnyTags('First Tag, Second Tag, Third Tag'); // Multiple tag names array $post->withAnyTags(['First Tag', 'Second Tag'])->get(); // Multiple tag names collection $post->withAnyTags(collect(['First Tag', 'Second Tag']))->get(); // Multiple tag model instances $tagInstances = app('rinvex.tags.tag')->whereIn('id', [1, 2, 5])->get(); $post->withAnyTags($tagInstances)->get();
注意
withAnyTags()
范围会找到具有给定任何关联标签的帖子。它通常返回一个查询构建器,因此您可以将其链式调用或调用get()
方法,例如执行并获取结果。- 类似地,还有一些其他范围,如
withAllTags()
,它会找到具有给定所有关联标签的帖子;withoutTags()
会找到没有给定任何关联标签的帖子;最后是withoutAnyTags()
,它会找到没有任何关联标签的帖子。所有范围都是平等创建的,具有相同的签名,并返回查询构建器。
标签翻译
如下轻松管理标签翻译
$tag = app('rinvex.tags.tag')->find(1); // Update name translations $tag->setTranslation('name', 'en', 'New English Tag Name')->save(); // Alternatively you can use default eloquent update $tag->update([ 'name' => [ 'en' => 'New Tag', 'ar' => 'وسم جديد', ], ]); // Get single tag translation $tag->getTranslation('name', 'en'); // Get all tag translations $tag->getTranslations('name'); // Get tag name in default locale $tag->name;
注意:有关详细信息,请参阅 可翻译 包。
变更日志
请参阅 变更日志 了解项目的完整历史。
支持
以下支持渠道随时可用
贡献 & 协议
感谢您考虑为这个项目做出贡献!贡献指南可以在 CONTRIBUTING.md 中找到。
欢迎提交错误报告、功能请求和拉取请求。
安全漏洞
如果您在这个项目中发现安全漏洞,请发送电子邮件至 help@rinvex.com。所有安全漏洞都将得到及时解决。
关于雷文克斯
雷文克斯是一家成立于2016年6月的埃及亚历山大的软件解决方案初创公司,专注于为中小企业提供集成企业解决方案。我们相信,我们的动力——价值、触达和影响是我们与众不同的地方,通过软件的力量,我们释放了我们的哲学的无限可能性。我们喜欢称之为“与生命同步的创新”。这就是我们如何为推进人类文明做出贡献的方式。
许可
本软件在 MIT 许可证 (MIT) 下发布。
(c) 2016-2020 雷文克斯有限责任公司,部分权利保留。