CodeIgniter 4 如何实现table_class表subject_id与class_name联合唯一校验
CodeIgniter 4 双字段联合唯一验证实现方案
原生is_unique仅支持单字段校验,双字段联合唯一需要自定义验证规则实现,步骤如下:
步骤1:创建自定义验证规则类
在app/Validation目录下新建CustomRules.php文件,代码如下:
<?php namespace App\Validation; class CustomRules { /** * 双字段联合唯一校验 * @param string $str 当前校验字段的值(此处为class_name的值) * @param string $params 规则传参,格式:表名,关联字段名,当前校验字段名[,忽略的主键ID] * @param array $data 所有提交的字段数据 * @return bool */ public function unique_combination(string $str, string $params, array $data): bool { // 拆分传入参数 $params = explode(',', $params); $table = $params[0]; $relatedField = $params[1]; $currentField = $params[2]; $ignoreId = $params[3] ?? null; // 校验关联字段是否存在 if (!isset($data[$relatedField])) { return false; } $relatedVal = $data[$relatedField]; $currentVal = $str; // 构造查询,转小写实现不区分大小写匹配 $db = db_connect(); $builder = $db->table($table) ->where("LOWER({$relatedField})", strtolower($relatedVal)) ->where("LOWER({$currentField})", strtolower($currentVal)); // 更新场景下排除当前编辑的记录 if ($ignoreId && isset($data[$ignoreId])) { $builder->where("{$ignoreId} !=", $data[$ignoreId]); } return $builder->countAllResults() === 0; } }
步骤2:注册自定义规则
打开app/Config/Validation.php,将自定义规则类加入$ruleSets数组:
public array $ruleSets = [ \CodeIgniter\Validation\Rules::class, \CodeIgniter\Validation\FormatRules::class, \CodeIgniter\Validation\FileRules::class, \CodeIgniter\Validation\CreditCardRules::class, // 新增自定义规则类 \App\Validation\CustomRules::class, ];
步骤3:配置验证规则与错误提示
3.1 定义验证规则
在你的数据验证逻辑中,给class_name字段添加unique_combination规则:
$validationRules = [ 'subject_id' => 'required', 'class_name' => 'required|max_length[100]|unique_combination[table_class,subject_id,class_name]', ];
规则参数说明:
unique_combination[表名,联合校验的另一个字段名,当前校验字段名];如果是更新场景,可追加第四个参数为主键名:unique_combination[table_class,subject_id,class_name,id],提交数据时带上主键id即可自动排除当前记录。
3.2 配置中文错误提示
打开app/Language/zh_CN/Validation.php,在语言数组中新增自定义规则的错误提示:
'unique_combination' => '该科目下已存在同名班级,请更换班级名称',
效果说明
按照以上配置后:
- 提交
subject_id=A+class_name=Algorithm时,会匹配表中已有记录,抛出验证错误 - 提交
subject_id=B+class_name=Algorithm或subject_id=A+class_name=Big data时,验证通过可正常入库 - 自动忽略大小写,即使提交
class_name=algorithm和已有Algorithm也会判定为重复
内容的提问来源于stack exchange,提问作者Wahyudi
相关产品推荐
相关产品推荐

