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

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('该邮箱已被占用,请更换其他邮箱');
            }
        }
    ],
];

原理说明

  1. 验证属性格式为contacts.{index}.email,通过explode('.', $attribute)拆分出具体索引值
  2. 利用索引从请求的contacts数组中精准定位对应项的id
  3. 数据库查询时,若存在联系人ID则排除该ID,避免更新时将自身邮箱判定为重复

内容的提问来源于stack exchange,提问作者Mohsin Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:45:39