Codeigniter 4更新记录时is_unique验证误报非唯一错误
问题解决方法
CodeIgniter框架的is_unique验证规则原生支持更新场景下排除当前记录的配置,不需要额外编写自定义验证逻辑,即可解决编辑时触发自身字段重复校验的问题。
核心规则格式
is_unique校验排除指定记录的完整参数格式为:
is_unique[表名.校验字段名,主键字段名,需要排除的记录主键值]
规则生效时会自动在重复值查询中追加主键字段 != 排除主键值的条件,自动跳过当前正在编辑的记录,不会将当前记录本身的字段值判定为重复。
具体实现步骤
- 首先确保更新操作的表单中携带当前编辑记录的ID,比如添加隐藏表单域:
<input type="hidden" name="id" value="<?=$currentTask['id']?>"> - 不要把带排除参数的规则硬编码在Model的静态
$validationRules属性中——新增操作时没有传入记录ID,硬编码会导致新增验证异常。处理更新请求时动态设置Title字段的验证规则即可:// 控制器更新逻辑示例 $taskId = $this->request->getPost('id'); // 先校验ID合法性,确认对应任务记录存在 if (!is_numeric($taskId) || !$this->taskModel->find($taskId)) { return redirect()->back()->with('error', '非法请求'); } // 动态设置Title字段的验证规则,传入需要排除的当前记录ID $this->taskModel->setValidationRule('Title', "required|min_length[5]|max_length[15]|is_unique[tasks.Title,id,$taskId]"); // 后续按原有逻辑接收表单数据、执行验证、更新记录即可
其他场景适配
- 如果不依赖Model自带的验证,而是手动调用验证服务,直接在规则配置中拼接传入ID即可:
$validation = \Config\Services::validation(); $taskId = $this->request->getPost('id'); $validation->setRules([ 'Title' => "required|min_length[5]|max_length[15]|is_unique[tasks.Title,id,$taskId]", 'Description' => 'required|max_length[300]', 'CreatedAt' => 'required', 'UpdatedAt' => 'required', 'DueDate' => 'required|ValidateDueDate[DueDate]', 'AssignedTo' => 'required', 'Author' => 'required' ]); - 如果数据表主键不是默认的
id,比如主键名为task_id,只需要把规则中第二个参数替换成实际主键字段名即可,示例:is_unique[tasks.Title,task_id,$taskId]
注意:框架验证类会自动对规则中传入的参数做转义处理,不需要额外担心SQL注入问题,只需要提前校验传入ID的合法性、确认对应记录存在即可。
内容的提问来源于stack exchange,提问作者Sardar_Umer
相关产品推荐
相关产品推荐

