表单模型在更新数据时,unique 唯一性规则验证的问题。 [ 2.0 版本 ]
数据模型Admin规则如下:
创建的表单模型入下:
当我进行如下数据修改操作时,只修改密码字段,保存时提示用户名和邮箱存在,验证不通过。如何在我不修改用户名和邮箱时,通过唯一性验证?
最佳答案
-
条件式验证:when
新增时验证,修改时不验证共 9 条回复paopao2hao 回复于 2018-03-23 15:31 回复修改时也需要验证唯一性的,如数据库中有a,b两个用户,我修改a时,把名字从a改成b是要求不能通过验证的,因为b在数据库中已经存在了。如果修改a时,没有改变名字,只是修改了其他不需要唯一性验证的属性,则要求能通过验证。
@paopao2hao 要灵活发挥啊,when后面的条件是自己写的嘛,按你的需求你可以这样写:
when (新增) 或 (名称!=旧值)具体的代码类似这样:
[['name'], 'unique', 'when' => function () { return $this->isNewRecord || ($this->name != $oldName); }],
paopao2hao 回复于 2018-03-28 15:56 回复@yzh52521 好像要自己设置,但我不知道怎么设置,而且我用的是表单模型,没有isNewRecord属性,所以这个回答没有解决我的问题
@paopao2hao 说是没解决你的问题,那是因为你还没理解那段代码的意思,有没有想明白条件式验证的意思呀。你用的是表单模型,没有isNewRecord属性,你就无法判断是新增还是修改数据了吗?
paopao2hao 回复于 2018-03-30 08:48 回复@oldnew 非常感谢你的回答,可能我的表述有问题,确实是我还没理解那段代码,并不是说你的方法有问题。
感谢你热情的答复,望继续得到你的帮助!@paopao2hao 看伪码:when (新增) 或 (修改 && 名称!=旧值)
条件式验证,就是when后面为真就验证,为假就不验证。
首先要搞清楚是新增还是修改,因为你用的是表单模型不是AR,那你就得搞个变量用来保存是新增还是修改数据,总该知道现在是新增还是修改吧。
然后就是第2个括号里的旧值,没用AR没有自动保存旧值,那你就当修改时,把旧值保存到一个变量啊,分分钟就搞定的。
其他 9 个回答
-
dingjj2010 回答于 2018-03-23 08:54 举报
1: rules里面有个内容叫 场景(scenario),区分不同的场景验证不同的字段. 例如insert场景,update场景
2: 修改的时候,正常情况下, 把修改账户,邮箱和修改密码分开做2个修改页面
3: 如果要实现unique, 在unique规则下, 可传参数fiter, 就和where一样, 把非当前记录id(!id)当做条件.
详见:http://www.yiichina.com/doc/guide/2.0/tutorial-core-validators#unique共 1 条回复paopao2hao 回复于 2018-03-23 09:52 回复在unique规则下,传递fiter参数,把当前记录过滤掉,具体写法是怎么样的?
晦涩de咚 觉得很赞 -
SaltwaterRoom 回答于 2018-03-25 15:20 举报
public
-
['email', 'unique', 'targetClass' => User::class, 'filter' => function ($query) {
if (!$this->getModel()->isNewRecord) { $query->andWhere(['not', ['id' => $this->getModel()->id]]); } },'message' => 'This email address has already been taken.'], /** * @return User */ public function getModel() { if (!$this->model) { $this->model = new User(); } return $this->model; }
paopao2hao
最后登录:2019-03-26
在线时长:13小时22分
- 粉丝2
- 金钱65
- 威望0
- 积分195