suppercup/laravel-tags

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

1.0.0 2020-11-16 10:29 UTC

This package is auto-updated.

Last update: 2024-09-16 21:10:58 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 包。探索这些。
  • 两种方法 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)发布。

© 2016-2020 Rinvex LLC,部分权利保留。