yii2唯一验证器仅当字段不为空时
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii2唯一验证器仅当字段不为空时相关的知识,希望对你有一定的参考价值。
在Yii2中,我的数据库中有两个字段:email
和shopId
Email
和shopId
应该是unique
在一起Email
也可以是empty
(NULL
),而shopId
总是一个整数
这些是我在模型中的规则:
[['email'],'default','value' => NULL],
[['shopId'], 'integer'],
[['email','shopId'], 'unique', 'targetAttribute' => ['email', 'shopId'], 'message' => 'Already taken!'],
如果我有两个条目,例如,这不起作用email="NULL"
和shopId="1"
。
我怎么解决这个问题?
答案
将skipOnEmpty
属性设置为false
http://www.yiiframework.com/doc-2.0/yii-validators-validator.html# $ skipOnEmpty-detail
另一答案
虽然您的解决方案正在运行,但技术上并不正确。验证规则
[['email','shopId'], 'unique', 'targetAttribute' => ['email', 'shopId']]
如果email
不为空(期望的功能),将验证shopId
与给定的email
是唯一的,但如果shopId
不为空(不需要的话),它还将验证email
对于给定的shopId
是唯一的。您正在验证带有两个DB查询的两个字段。
符合您需求的验证规则是
[['email'], 'unique', 'targetAttribute' => ['email', 'shopId']]
说“如果email
不是空的,检查email
和shopId
的组合是否唯一,并将结果绑定到email
属性”。
另一答案
我在规则中使用了when条件
[
['email', 'shopId'],
'unique',
'targetAttribute' => ['email', 'shopId'],
'message' => 'Diese E-Mail Adresse ist bereits registriert!',
'when' => function ($model) {
return !empty($model->email);
}
],
以上是关于yii2唯一验证器仅当字段不为空时的主要内容,如果未能解决你的问题,请参考以下文章