You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dimsav/laravel-translatable验证翻译字段唯一规则问题

解决Laravel Translatable API多语言验证问题

首先咱们先拆解你遇到的两个核心问题:一是错误提示name.title is required的根源,二是实现仅fa语言title字段唯一的验证规则。

1. 先修正请求数据结构(错误提示的核心原因)

你当前的报错说明请求里的title字段被错误嵌套在name属性下了,但你的WarehouseType模型中name是独立字段,title是翻译属性,两者应该分开。正确的请求结构应该是以下两种之一:

结构一(推荐,用translations包裹翻译字段)

{
    "name": "wh_type_001",
    "translations": {
        "fa": {"title": "نوع انبار ۱"},
        "en": {"title": "Warehouse Type 1"},
        "ar": {"title": "نوع المستودع 1"}
    }
}

结构二(直接用语言作为顶级键)

{
    "name": "wh_type_001",
    "fa": {"title": "نوع انبار ۱"},
    "en": {"title": "Warehouse Type 1"},
    "ar": {"title": "نوع المستودع 1"}
}

2. 调整FormRequest验证规则

根据你的需求(仅fa语言title唯一,三种语言title都必填,name必填且唯一),修改rules方法:

对应结构一的验证规则

public function rules() {
    switch ($this->method()) {
        case 'POST': {
            return [
                'name' => 'required|unique:warehouse_types',
                // 波斯语title必填+唯一(限定locale=fa时唯一)
                'translations.fa.title' => 'required|unique:warehouse_type_translations,title,NULL,id,locale,fa',
                // 英语、阿拉伯语title仅需必填
                'translations.en.title' => 'required',
                'translations.ar.title' => 'required',
            ];
        }
        default:
            return [];
    }
}

对应结构二的验证规则

public function rules() {
    switch ($this->method()) {
        case 'POST': {
            return [
                'name' => 'required|unique:warehouse_types',
                'fa.title' => 'required|unique:warehouse_type_translations,title,NULL,id,locale,fa',
                'en.title' => 'required',
                'ar.title' => 'required',
            ];
        }
        default:
            return [];
    }
}

3. 关键规则解释

  • unique:warehouse_type_translations,title,NULL,id,locale,fa:这条规则的作用是仅当warehouse_type_translations表中locale字段为fa时,校验title的唯一性。后面的NULL,id是为了更新场景预留的(忽略当前记录),创建场景下可以保持NULL。
  • 之前用*.title的通配符会误匹配到错误嵌套的name.title字段,导致不必要的必填校验,所以必须明确指定翻译字段的路径。

可选:自定义友好错误消息

如果需要更清晰的错误提示,可以在FormRequest中添加messages方法:

public function messages() {
    return [
        'name.required' => '仓库类型名称不能为空',
        'name.unique' => '该仓库类型名称已存在',
        'translations.fa.title.required' => '波斯语标题不能为空',
        'translations.fa.title.unique' => '该波斯语标题已存在',
        'translations.en.title.required' => '英语标题不能为空',
        'translations.ar.title.required' => '阿拉伯语标题不能为空',
        // 结构二的话对应修改字段名:'fa.title.required' => '...'
    ];
}

内容的提问来源于stack exchange,提问作者Ahmad Badpey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:57:43