如何在 Yii 2 中使用唯一验证

buq*_*ard -2 validation yii2

我想让用户名和电子邮件地址独一无二。

我正在使用 yii base 来开发我的应用程序。它对我不起作用。

用户名和邮箱已被占用

我的型号:

public function rules()
{
     return [
            [['username', 'email', 'password'], 'required'],
            [['username', 'email'], 'unique']
     ];
}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

public function actionCreate()
{
    $model = new Userapp();
    $post = Yii::$app->request->post('UserApp'); 
    if (Yii::$app->request->isPost && $model->validate()) {
        $model->email = $post['email'];
        $model->username = $post['username'];
        $model->password = $model->setPassword($post['password']);
        if($model->save()){
            return $this->redirect(['view', 'id' => $model->id]);
        }
    }
    return $this->render('create', [
        'model' => $model,
    ]);
}
Run Code Online (Sandbox Code Playgroud)

Kyl*_*yle 6

Yii2 有很多内置的验证器,请参阅

其中之一是unique

来自 Yii2 文档。

// a1 在“a1”属性表示的列中必须是唯一的

['a1', 'unique'],
Run Code Online (Sandbox Code Playgroud)

// a1需要是唯一的,但a2列将用于检查a1值的唯一性

['a1', 'unique', 'targetAttribute' => 'a2'],
Run Code Online (Sandbox Code Playgroud)

更新:

在您的规则数组中,添加唯一验证器,email如下username所示:

public function rules()
{
     return [
        [['username', 'email', 'password'], 'required'],
        [['username', 'email'], 'unique'],
     ];
Run Code Online (Sandbox Code Playgroud)

}

然后在保存模型之前:

if(!$model->validate()){
   return false; 
} 
Run Code Online (Sandbox Code Playgroud)

更新2:

您正在尝试在分配任何属性之前验证模型。将您的控制器代码更新为以下内容:

public function actionCreate()
{
    $model = new Userapp();
    $post = Yii::$app->request->post('UserApp'); 
        if (Yii::$app->request->isPost) {
             $model->email = $post['email'];
             $model->username = $post['username'];
             $model->password = $model->setPassword($post['password']);
            if($model->validate() && $model->save()){
                return $this->redirect(['view', 'id' => $model->id]);
            } 
            else {
                return false; 
             }
          }
   return $this->render('create', [
        'model' => $model,
   ]);
}
Run Code Online (Sandbox Code Playgroud)