rinvex/laravel-tags

此包已被废弃,不再维护。没有建议的替代包。

Rinvex Tags 是一个多态的 Laravel 包,用于标签管理。您可以轻松地对任何 eloquent 模型进行标记,并利用 Sluggable 和 Translatable 模型的强大功能。

v7.1.2 2023-07-03 13:28 UTC

README

Rinvex Tags 是一个多态的 Laravel 包,用于标签管理。您可以轻松地对任何 eloquent 模型进行标记,并利用 SluggableTranslatable 模型的强大功能。

Packagist Scrutinizer Code Quality Travis StyleCI License

安装

  1. 通过 composer 安装此包

    composer require rinvex/laravel-tags
  2. 发布资源(迁移和配置文件)

    php artisan rinvex:publish:tags
  3. 执行以下命令以执行迁移

    php artisan rinvex:migrate:tags
  4. 完成!

使用方法

要将标签支持添加到您的 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() 方法可以删除不在给定项中的任何记录,此方法接受一个可选的第二个布尔参数,将该参数设置为 truefalse
  • 要删除模型标签,您可以使用 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() 方法检查给定的标签是否被附加到模型上。它返回布尔值 truefalse 作为结果。
  • 类似地,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,部分权利保留。