CodeIgniter4 更新操作中唯一名称验证异常问题求助
问题描述
使用模态框加载数据库中的角色名称值,点击更新按钮时,is_unique验证会检查名称是否已存在于数据库中。但即使未修改该名称,验证仍会触发,不符合需求。
相关代码
表单代码
<form action="<?= base_url('users/createRole'); ?>" method="post"> <div class="modal-body"> <input type="hidden" name="roleID" id="roleID"> <div class="mb-3"> <label for="inputRoleName" class="form-label">添加角色</label> <input type="text" class="form-control" id="inputRoleName" name="inputRoleName" placeholder="角色名称"> </div> </div> <div class="modal-footer"> <button type="submit" class="btn btn-primary">保存角色</button> <button type="button" class="btn btn-light" data-bs-dismiss="modal">关闭</button> </div> </form>
(注:原表单德语标签已改为中文,便于理解)
JS代码
$(".btnEditRole").click(function() { const roleID = $(this).data('id'); const inputRoleName = $(this).data('role'); $('#modalTitle').html('更新角色数据'); $('.modal-footer button[type=submit]').html('更新角色'); $('.modal-content form').attr('action', '<?= base_url('users/updateRole') ?>'); $('#roleID').val(roleID); $('#inputRoleName').val(inputRoleName); $('.modal').on('hidden.bs.modal', function() { location.reload(); // 模态框关闭时刷新页面 }); });
PHP更新函数代码
public function updateRole() { if (!$this->validate(['inputRoleName' => ['rules' => 'is_unique[user_role.role_name]']])) { session()->setFlashdata('notif_error', '<b>角色更新失败</b> 该角色名称已存在!'); return redirect()->to(base_url('users')); } $updateRole = $this->userModel->updateRole($this->request->getPost(null, FILTER_UNSAFE_RAW)); if ($updateRole) { session()->setFlashdata('notif_success', '<b>角色数据更新成功</b>'); return redirect()->to(base_url('users')); } else { session()->setFlashdata('notif_error', '<b>角色数据更新失败</b>'); return redirect()->to(base_url('users')); } }
(注:原德语提示已改为中文)
解决方案
问题核心是默认的is_unique规则会检查整个表的唯一性,包括当前要更新的记录。需要修改验证规则,排除当前角色的ID,让验证只检查其他记录是否重复。
修改后的PHP更新函数:
public function updateRole() { // 获取当前要更新的角色ID $roleID = $this->request->getPost('roleID'); // 调整is_unique规则,排除当前记录 if (!$this->validate([ 'inputRoleName' => [ 'rules' => "is_unique[user_role.role_name,role_id,$roleID]" ] ])) { session()->setFlashdata('notif_error', '<b>角色更新失败</b> 该角色名称已存在!'); return redirect()->to(base_url('users')); } $updateRole = $this->userModel->updateRole($this->request->getPost(null, FILTER_UNSAFE_RAW)); if ($updateRole) { session()->setFlashdata('notif_success', '<b>角色数据更新成功</b>'); return redirect()->to(base_url('users')); } else { session()->setFlashdata('notif_error', '<b>角色数据更新失败</b>'); return redirect()->to(base_url('users')); } }
关键说明
is_unique[表名.字段名,排除字段,排除值]是CodeIgniter的扩展用法,用于更新场景中跳过当前记录的唯一性检查。- 请根据实际表结构调整参数:
user_role是角色表名,role_id是表中存储角色ID的字段名(如果你的字段名是id,直接替换即可)。
内容的提问来源于stack exchange,提问作者Sebastian2513
相关产品推荐
相关产品推荐

