krisozolins/laravel-unique-translation

codezero-be/laravel-unique-translation 包的分支

此包的官方仓库似乎已消失,因此该包已被冻结。

1.1.4 2020-05-21 09:10 UTC

This package is auto-updated.

Last update: 2024-01-21 19:10:04 UTC


README

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

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

假设你想要在不同语言中存储 slug 对应的 Post 模型。

神奇的 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] 会失败,因为已经存在一个值为 abcnl

错误信息

无论您正在验证单个翻译('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)。有关更多信息,请参阅许可证文件