使用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
相关产品推荐
相关产品推荐

