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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 21:39:04