Yii 1.1x使用带条件的unique规则时出现错误的问题
解决Yii 1.1x同一分类下标题唯一的验证问题
嘿,我懂你的需求——要确保同一分类下的标题不能重复,但不同分类之间允许标题撞车对吧?你之前的验证规则没配置到点子上,所以才会出现错误。咱们直接上正确的解决方案:
在你的模型rules()方法里,需要用到Yii的unique验证器,并且指定联合唯一的字段组合(也就是title + category_id),这样系统就会同时检查这两个字段的组合是否在数据库中唯一。
完整的验证规则代码
public function rules() { return array( // 保留你原有的其他验证规则... // 新增/插入场景的验证:检查标题+分类的组合是否唯一 array('title', 'unique', 'message' => '同一分类下已存在相同标题!', 'attributeNames' => array('title', 'category_id')), // 更新场景的验证:排除当前模型自身的记录,避免编辑时误判重复 array('title', 'unique', 'message' => '同一分类下已存在相同标题!', 'attributeNames' => array('title', 'category_id'), 'except' => 'insert', 'criteria' => array( 'condition' => 'id != :id', 'params' => array(':id' => $this->id), )), ); }
关键细节说明
attributeNames:这是核心参数,指定了需要联合验证唯一性的字段数组。把title和category_id放进去后,系统就会判断这两个字段的组合是否唯一,完美匹配你的需求。message:自定义验证失败时的提示文案,让用户能直观明白问题出在哪。- 更新场景的特殊处理:当编辑现有记录时,必须通过
criteria添加排除当前ID的条件,否则系统会把当前正在编辑的记录也算作“重复项”,导致无法正常保存。
测试建议
- 新增一条记录:选分类A,输入标题“产品指南”,保存成功。
- 再新增一条记录:同样选分类A,输入“产品指南”,此时应该弹出你设置的错误提示。
- 新增第三条记录:选分类B,输入“产品指南”,应该能正常保存,符合跨分类允许重复的要求。
这样配置后,就能精准实现你想要的功能啦!
内容的提问来源于stack exchange,提问作者codingnighter2000
相关产品推荐
相关产品推荐

