rinvex / laravel-tags
Rinvex Tags 是一个多态的 Laravel 包,用于标签管理。您可以轻松地对任何 eloquent 模型进行标记,并利用 Sluggable 和 Translatable 模型的强大功能。
Requires
- php: ^8.1.0
- illuminate/console: ^10.0.0 || ^11.0.0
- illuminate/database: ^10.0.0 || ^11.0.0
- illuminate/support: ^10.0.0 || ^11.0.0
- rinvex/laravel-support: ^7.0.0
- spatie/eloquent-sortable: ^4.0.0
- spatie/laravel-sluggable: ^3.4.0
- symfony/console: ^6.2.0
Requires (Dev)
- codedungeon/phpunit-result-printer: ^0.32.0
- illuminate/container: ^10.0.0 || ^11.0.0
- phpunit/phpunit: ^10.1.0
This package is auto-updated.
Last update: 2024-08-03 16:14:17 UTC
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 包以获取更多详情。
智能参数检测
Rinvex Tags 方法可以接受标签列表,非常智能,可以处理几乎所有类型的输入,就像你在上面的例子中看到的那样。它会检查输入类型并相应地执行。
检索所有与标签关联的模型
你可能遇到需要获取与特定标签关联的所有模型的情况,你可以轻松地按照以下方式操作
$tag = app('rinvex.tags.tag')->find(1); $tag->entries(\App\Models\Post::class)->get();
查询范围
是的,Rinvex Tags 随带一些出色的查询范围,以便你方便使用,使用示例
// 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;
注意:查看 Translatable 包以获取更多详情。
变更日志
请参阅 变更日志 了解项目的完整历史。
支持
以下支持渠道随时可供使用
贡献 & 协议
感谢您考虑为此项目做出贡献!贡献指南可以在 CONTRIBUTING.md 中找到。
欢迎提交错误报告、功能请求和拉取请求。
安全漏洞
如果您在此项目中发现安全漏洞,请发送电子邮件至 help@rinvex.com。所有安全漏洞都将得到及时解决。
关于 Rinvex
Rinvex 是一家软件解决方案初创公司,自 2016 年 6 月在埃及亚历山大成立以来,专门为中小企业提供一体化企业解决方案。我们相信,我们的动力是“价值、触达和影响”,这是我们与众不同的地方,通过软件的力量释放我们哲学的无限可能性。我们喜欢称之为“生活节奏的创新”。这就是我们如何为推动人类进步尽一份力的。
许可证
本软件根据 MIT 许可证 (MIT) 发布。
(c) 2016-2022 Rinvex LLC,部分权利保留。