krisozolins / laravel-unique-translation
codezero-be/laravel-unique-translation 包的分支
此包的官方仓库似乎已消失,因此该包已被冻结。
Requires
- php: >=7.0.0
Requires (Dev)
- fzaninotto/faker: ~1.4
- mockery/mockery: 0.9.*
- orchestra/testbench: ~3.5.0
- phpunit/phpunit: ~6.0
- spatie/laravel-translatable: ^2.1
README
检查数据库中 JSON 列中翻译值是否唯一。
假设你想要在不同语言中存储 slug
对应的 Post
模型。
神奇的 spatie/laravel-translatable
包使得这一点变得非常简单!
但是,你还需要确保每种翻译在其语言中是唯一的。
这就是这个包发挥作用的地方。
要求
- PHP >= 7.0
- MySQL >= 5.7
- Laravel >= 5.5
- spatie/laravel-translatable
安装
通过 Composer 需求此包
composer require krisozolins/laravel-unique-translation
Laravel 将自动注册 ServiceProvider。
使用
以下示例中,我将使用 posts
表中的 slug
作为验证的主题。
验证单个翻译
您的表单可以提交单个 slug
<input name="slug">
然后我们可以检查它是否在 当前区域 中是唯一的
$attributes = request()->validate([ 'slug' => 'required|unique_translation:posts', ]);
您也可以使用 Rule 实例
use KrisOzolins\UniqueTranslation\UniqueTranslationRule; $attributes = request()->validate([ 'slug' => ['required', UniqueTranslationRule::for('posts')], ]);
验证翻译数组
您的表单也可以提交 slugs 的数组。
<input name="slug[en]"> <input name="slug[nl]">
在这种情况下,我们需要验证整个数组。注意 slug.*
键。
$attributes = request()->validate([ 'slug.*' => 'unique_translation:posts', // or... 'slug.*' => UniqueTranslationRule::for('posts'), ]);
指定列
也许您的表单字段名称为 post_slug
,而您的数据库字段为 slug
$attributes = request()->validate([ 'post_slug.*' => 'unique_translation:posts,slug', // or... 'post_slug.*' => UniqueTranslationRule::for('posts', 'slug'), ]);
指定数据库连接
如果您正在使用多个数据库连接,您可以通过在表名前添加连接名称(由点分隔)来指定要使用哪个连接
$attributes = request()->validate([ 'slug.*' => 'unique_translation:db_connection.posts', // or... 'slug.*' => UniqueTranslationRule::for('db_connection.posts'), ]);
忽略具有 ID 的记录
如果您正在更新记录,您可能希望忽略唯一的检查本身。
$attributes = request()->validate([ 'slug.*' => "unique_translation:posts,slug,{$post->id}", // or... 'slug.*' => UniqueTranslationRule::for('posts')->ignore($post->id), ]);
忽略具有特定列和值的记录
如果您的 ID 列具有不同的名称,或者您只想使用另一个列
$attributes = request()->validate([ 'slug.*' => 'unique_translation:posts,slug,ignore_value,ignore_column', // or... 'slug.*' => UniqueTranslationRule::for('posts')->ignore('ignore_value', 'ignore_column'), ]);
示例
您现有的 slug
列(JSON)在 posts
表中
{ "en":"not-abc", "nl":"abc" }
您的表单输入以创建新记录
<input name="slug[en]" value="abc"> <input name="slug[nl]" value="abc">
您的验证逻辑
$attributes = request()->validate([ 'slug.*' => 'unique_translation:posts', ]);
结果是 slug[en]
是有效的,因为数据库中唯一的 en
值是 not-abc
。
并且 slug[nl]
会失败,因为已经存在一个值为 abc
的 nl
。
错误信息
无论您正在验证单个翻译('slug'
)还是一组翻译('slug.*'
),如果验证失败,您将找到单个和本地化键的错误。
$errors->first('slug'); $errors->first('slug.en');
您可以使用以下任何键传递自己的错误消息。找到的第一个将被使用。
$attributes = request()->validate([ 'slug.*' => 'unique_translation:posts', ], [ 'slug.unique_translation' => 'Your custom :attribute error.', 'slug.*.unique_translation' => 'Your custom :attribute error.', 'slug.en.unique_translation' => 'Your custom :attribute error.', ]);
测试
vendor/bin/phpunit
安全
如果您发现任何安全相关的问题,请通过电子邮件联系我,而不是使用问题跟踪器。
更新日志
查看重要变更列表,请参阅更新日志。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。