2018-03-22 19:55:19 6066次浏览 10条回答 0 悬赏 10 金钱

数据模型Admin规则如下:
11111.png

创建的表单模型入下:
22222222.png

当我进行如下数据修改操作时,只修改密码字段,保存时提示用户名和邮箱存在,验证不通过。如何在我不修改用户名和邮箱时,通过唯一性验证?
3333.png

最佳答案

  • oldnew 发布于 2018-03-23 08:51 举报

    条件式验证:when
    新增时验证,修改时不验证

    9 条回复
    回复于 2018-03-23 15:31 回复

    修改时也需要验证唯一性的,如数据库中有a,b两个用户,我修改a时,把名字从a改成b是要求不能通过验证的,因为b在数据库中已经存在了。如果修改a时,没有改变名字,只是修改了其他不需要唯一性验证的属性,则要求能通过验证。

    回复于 2018-03-24 19:21 回复

    要灵活发挥啊,when后面的条件是自己写的嘛,按你的需求你可以这样写:
    when (新增) 或 (名称!=旧值)

    具体的代码类似这样:

    [['name'], 'unique', 'when' => function () {
            return $this->isNewRecord || ($this->name != $oldName);
        }],
    
    回复于 2018-03-28 14:28 回复

    $oldName要自己设置吗

    回复于 2018-03-28 15:56 回复

    好像要自己设置,但我不知道怎么设置,而且我用的是表单模型,没有isNewRecord属性,所以这个回答没有解决我的问题

    回复于 2018-03-28 16:10 回复

    这样不知道行不行,你试试

            [['username'],'unique','when' => function ($model) {
                return $this->isNewRecord || ($this->username != $model->username);
            }],
    
    回复于 2018-03-29 23:50 回复

    如果是ActiveRecord,会自动保存旧值。不是的话,那就要自己设置。

    AR可以这样调用获取旧值:
    yii\db\ActiveRecord::getOldAttributes()
    或者
    yii\db\ActiveRecord::getOldAttribute()

    回复于 2018-03-29 23:57 回复

    说是没解决你的问题,那是因为你还没理解那段代码的意思,有没有想明白条件式验证的意思呀。你用的是表单模型,没有isNewRecord属性,你就无法判断是新增还是修改数据了吗?

    回复于 2018-03-30 08:48 回复

    非常感谢你的回答,可能我的表述有问题,确实是我还没理解那段代码,并不是说你的方法有问题。
    感谢你热情的答复,望继续得到你的帮助!

    回复于 2018-03-30 13:17 回复

    看伪码:when (新增) 或 (修改 && 名称!=旧值)
    条件式验证,就是when后面为真就验证,为假就不验证。
    首先要搞清楚是新增还是修改,因为你用的是表单模型不是AR,那你就得搞个变量用来保存是新增还是修改数据,总该知道现在是新增还是修改吧。
    然后就是第2个括号里的旧值,没用AR没有自动保存旧值,那你就当修改时,把旧值保存到一个变量啊,分分钟就搞定的。

  • 回答于 2018-03-22 21:23 举报

    唯一性字段不给修改

  • 回答于 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 条回复
    回复于 2018-03-23 09:52 回复

    在unique规则下,传递fiter参数,把当前记录过滤掉,具体写法是怎么样的?

    觉得很赞
  • 回答于 2018-03-23 12:40 举报

    主键id不用放在rules里,既然都是主键了由数据库自己去处理就行。

    1 条回复
    回复于 2018-03-23 15:34 回复

    admin模型是用GII自动生成的。

  • 回答于 2018-03-23 14:08 举报

    真的非常感谢!

  • 回答于 2018-03-25 15:20 举报

    public

  • 回答于 2018-03-29 08:49 举报

    $this->scenario='xx',然后rules on 就行

  • 回答于 2018-03-29 10:41 举报

    ['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;
    }
    
  • 回答于 2018-04-03 00:21 举报

    dfsdf sdfgdfgdfgg

    4 条回复
    回复于 2018-04-03 00:21 回复

    asdad

    回复于 2018-04-03 00:21 回复

    sadsfsfs

    回复于 2018-04-03 00:21 回复

    sdfssf

    回复于 2018-04-24 10:12 回复

    qwerqwerqwer

  • 回答于 2018-11-11 15:09 举报

    ???
    你们都不用exist??

    ['email', 'exist', 'targetClass' => '\common\models\User', 
    'filter' => ['email' => $this->email],'message' => '该邮箱地址已注册'],
    
您需要登录后才可以回答。登录 | 立即注册
paopao2hao
助理

paopao2hao

注册时间:2016-11-17
最后登录:2019-03-26
在线时长:13小时22分
  • 粉丝2
  • 金钱65
  • 威望0
  • 积分195

热门问题