suppercup / laravel-tags
Rinvex Tags 是一个多态的 Laravel 扩展包,用于标签管理。您可以轻松地对任何 Eloquent 模型进行标签化,并利用 Sluggable 和 Translatable 模型的强大功能。
Requires
- php: ^7.4.0|^7.3
- illuminate/console: ^7.0.0
- illuminate/database: ^7.0.0
- illuminate/support: ^7.0.0
- spatie/eloquent-sortable: ^3.7.0
- spatie/laravel-sluggable: ^2.2.0
- spatie/laravel-translatable: ^4.2.0
- suppercup/laravel-cacheable: ^1.0.0
- suppercup/laravel-support: ^1.0.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
包。探索这些。- 两种方法
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)发布。
© 2016-2020 Rinvex LLC,部分权利保留。