Laravel更新时数组验证邮箱唯一:如何获取contacts行ID?
解决Laravel批量联系人邮箱唯一性验证无法获取对应ID的问题
问题核心:request('contacts.*.id') 无法获取对应联系人ID,因为request不能直接解析验证规则里的通配符*,导致唯一性验证时无法排除当前联系人的邮箱。
解决方案:使用自定义闭包验证规则
通过解析验证属性的索引,从请求中精准获取对应联系人的ID,再完成唯一性判断:
return [ 'email' => "required|email|unique:clients,email," . request('id'), 'client_type_text' => 'required', 'client_name' => 'required', 'phone_number' => 'required', 'contacts' => 'required|array', 'contacts.*.firstname' => 'required', 'contacts.*.lastname' => 'required', 'contacts.*.mobile' => 'required', 'contacts.*.email' => [ 'required', 'email', function ($attribute, $value, $fail) { // 从验证属性(如"contacts.0.email")中拆分出联系人索引 $index = explode('.', $attribute)[1]; // 根据索引获取当前联系人的ID $contactId = request()->input("contacts.$index.id"); // 查询数据库:排除当前联系人ID后,检查邮箱是否重复 $isDuplicate = \App\Models\User::where('email', $value) ->when($contactId, fn($query) => $query->where('id', '!=', $contactId)) ->exists(); if ($isDuplicate) { $fail('该邮箱已被占用,请更换其他邮箱'); } } ], ];
原理说明
- 验证属性格式为
contacts.{index}.email,通过explode('.', $attribute)拆分出具体索引值 - 利用索引从请求的
contacts数组中精准定位对应项的id - 数据库查询时,若存在联系人ID则排除该ID,避免更新时将自身邮箱判定为重复
内容的提问来源于stack exchange,提问作者Mohsin Ali
相关产品推荐
相关产品推荐

