codezero / laravel-unique-translation
检查数据库中JSON列中的翻译值是否唯一。
Requires
- php: ^7.2|^8.0
Requires (Dev)
- orchestra/testbench: ^4.0|^5.0|^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^8.0|^9.0|^10.0
- spatie/laravel-translatable: ^4.4|^5.0|^6.0
README
重要:2022年3月
看到乌克兰现在发生的事情真是太可怕了,因为俄罗斯军队正在 轰炸房屋、医院和幼儿园。
请访问 supportukrainenow.org 了解您可以如何帮助那里的人们。传播这个消息。
如果您来自俄罗斯并且您反对这场战争,请以某种方式表达您的抗议。我知道您会因为这样做而受到惩罚,但您是那些无辜人民希望的之一。
检查数据库中JSON列中的翻译值是否唯一。
想象一下,您想要在不同的语言中为 Post
模型存储一个 slug
。
神奇的 spatie/laravel-translatable
包使得这变得非常简单!
但是,然后您想确保每种翻译在其语言中都是唯一的。
这正是这个包发挥作用的地方。
此包还支持 spatie/nova-translatable
,如果您正在使用 Laravel Nova,以及 filamentphp/spatie-laravel-translatable-plugin
,如果您正在使用 Filament。
✅ 要求
- PHP ^7.2 或 PHP ^8.0
- MySQL >= 5.7
- Laravel >= 6
- spatie/laravel-translatable ^4.4|^5.0|^6.0
- spatie/nova-translatable ^3.0
- filamentphp/spatie-laravel-translatable-plugin ^3.0
📦 安装
通过 Composer 需求此包
composer require codezero/laravel-unique-translation
Laravel 将自动注册 ServiceProvider。
🛠 使用
对于以下示例,我将使用 posts
表中的 slug
作为验证的主题。
☑️ 验证单个翻译
您的表单可以提交单个 slug
<input name="slug">
然后我们可以检查它是否在当前区域 中是唯一的
$attributes = request()->validate([ 'slug' => 'required|unique_translation:posts', ]);
您也可以使用 Rule 实例
use CodeZero\UniqueTranslation\UniqueTranslationRule; $attributes = request()->validate([ 'slug' => ['required', UniqueTranslationRule::for('posts')], ]);
☑️ 验证翻译数组
您的表单也可以提交 slug 数组。
<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'), ]);
☑️ 使用附加的 Where 子句
您可以在规则中添加4种类型的where子句。
where
$attributes = request()->validate([ 'slug.*' => "unique_translation:posts,slug,null,null,column,value", // or... 'slug.*' => UniqueTranslationRule::for('posts')->where('column', 'value'), ]);
whereNot
$attributes = request()->validate([ 'slug.*' => "unique_translation:posts,slug,null,null,column,!value", // or... 'slug.*' => UniqueTranslationRule::for('posts')->whereNot('column', 'value'), ]);
whereNull
$attributes = request()->validate([ 'slug.*' => "unique_translation:posts,slug,null,null,column,NULL", // or... 'slug.*' => UniqueTranslationRule::for('posts')->whereNull('column'), ]);
whereNotNull
$attributes = request()->validate([ 'slug.*' => "unique_translation:posts,slug,null,null,column,NOT_NULL", // or... 'slug.*' => UniqueTranslationRule::for('posts')->whereNotNull('column'), ]);
☑️ Laravel Nova
如果您正在使用Laravel Nova并结合spatie/nova-translatable
,则可以添加如下验证规则
Text::make(__('Slug'), 'slug') ->creationRules('unique_translation:posts,slug') ->updateRules('unique_translation:posts,slug,{{resourceId}}');
☑️ Filament
如果您正在使用Filament并结合filamentphp/spatie-laravel-translatable-plugin
,则可以添加如下验证规则
TextInput::make('slug') ->title(__('Slug')) ->rules([ UniqueTranslationRule::for('posts', 'slug') ])
TextInput::make('slug') ->title(__('Slug')) ->rules([ fn (Get $get) => UniqueTranslationRule::for('posts', 'slug')->ignore($get('id')) ])
🖥 示例
您现有的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
值。
⚠️ 错误信息
您可以通过常规方式传递自己的错误信息。
在验证单个表单字段时
<input name="slug">
$attributes = request()->validate([ 'slug' => 'unique_translation:posts', ], [ 'slug.unique_translation' => 'Your custom :attribute error.', ]);
在您的视图中,您可以使用$errors->first('slug')
获取错误。
或当验证数组时
<input name="slug[en]">
$attributes = request()->validate([ 'slug.*' => 'unique_translation:posts', ], [ 'slug.*.unique_translation' => 'Your custom :attribute error.', ]);
在您的视图中,您可以使用$errors->first('slug.en')
(en
是您的数组键)获取错误。
🚧 测试
vendor/bin/phpunit
☕️ 致谢
🔓 安全性
如果您发现任何与安全性相关的问题,请通过电子邮件联系我,而不是使用问题跟踪器。
📑 更新日志
有关此包的所有显著更改的完整列表可以在发布页面找到。
📜 许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。