codezero/laravel-unique-translation

检查数据库中JSON列中的翻译值是否唯一。

4.3.1 2024-04-17 08:28 UTC

This package is auto-updated.

Last update: 2024-09-17 09:18:40 UTC


README

重要:2022年3月

Support Ukraine

看到乌克兰现在发生的事情真是太可怕了,因为俄罗斯军队正在 轰炸房屋、医院和幼儿园

请访问 supportukrainenow.org 了解您可以如何帮助那里的人们。传播这个消息。

如果您来自俄罗斯并且您反对这场战争,请以某种方式表达您的抗议。我知道您会因为这样做而受到惩罚,但您是那些无辜人民希望的之一。

GitHub release Laravel License Build Status Code Coverage Code Quality Total Downloads

ko-fi

检查数据库中JSON列中的翻译值是否唯一。

想象一下,您想要在不同的语言中为 Post 模型存储一个 slug

神奇的 spatie/laravel-translatable 包使得这变得非常简单!

但是,然后您想确保每种翻译在其语言中都是唯一的。

这正是这个包发挥作用的地方。

此包还支持 spatie/nova-translatable,如果您正在使用 Laravel Nova,以及 filamentphp/spatie-laravel-translatable-plugin,如果您正在使用 Filament

✅ 要求

📦 安装

通过 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]将会失败,因为已经存在一个值为abcnl值。

⚠️ 错误信息

您可以通过常规方式传递自己的错误信息。

在验证单个表单字段时

<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)。有关更多信息,请参阅许可证文件