Php 如何使用Yii2检查数据库中是否存在数据?

Php 如何使用Yii2检查数据库中是否存在数据?,php,web,yii,yii2,Php,Web,Yii,Yii2,我正在学习Yii2,我正在尝试注册我的Yii基础项目。问题是,我无法检查数据库中用户输入的某些数据(在我的例子中是电子邮件和url)是否存在,从而为每个用户生成唯一的电子邮件 public function actionRegistration() { $model = new RegistrationForm(); if ($model->load(Yii::$app->request->post()) && $model->valid

我正在学习Yii2,我正在尝试注册我的Yii基础项目。问题是,我无法检查数据库中用户输入的某些数据(在我的例子中是电子邮件和url)是否存在,从而为每个用户生成唯一的电子邮件

public function actionRegistration()
{
    $model = new RegistrationForm();

    if ($model->load(Yii::$app->request->post()) && $model->validate())
    {           
        if (Users::findOne($model->email) !== null)//Doesn't work
            $error_email = "That email is taken. Try another.";
        if (Users::findOne($model->url) !== null)//Doesn't work
            $error_url = "That url is taken. Try another.";

        if (!(isset($error_email) || isset($error_url)))
        {
            $db = new Users();
            $db->name = $model->name;
            $db->email = $model->email;
            $db->password = $model->password;
            $db->url = $model->url;
            $db->save();
        }
        else
        {
            return $this->render('registration',
                    [
                        'model' => $model,
                        'error_email' => $error_email,
                        'error_url' => $error_url,
                    ]
                );
        }
    }
    else
    {
        return $this->render('registration',
                [
                    'model' => $model,
                ]
            );
    }
}
findOne()

Users::findOne(['email' => $model->email]);
或者更好

Users::find()->where(['email' => $model->email])->one();
one()
返回模型

您还可以使用exists()


返回布尔值的简单方法是在模型中设置验证规则

型号:

class RegistrationForm extends \yii\db\ActiveRecord  {

...

public function rules(){
    return [
        ['email', 'filter', 'filter' => 'trim'],
        ['email', 'email'],
        ['email', 'unique', 'targetClass' => '\common\models\Users', 'message' => 'This address is use.'],
    ];
}
和控制器

public function actionRegistration() {
$model = new RegistrationForm();

if ($model->load(Yii::$app->request->post()) && $model->validate()) {           

        $db = new Users();
        $db->name = $model->name;
        $db->email = $model->email;
        $db->password = $model->password;
        $db->url = $model->url;
        $db->save();
} else {

    return $this->render('registration',
            [
                'model' => $model,
            ]
        );
}
}

神奇之处在于$model->validate()


您的示例使用所有数据循环请求和响应$model->validate check by ajax并阻止发送请求php数据。

@yutsura ok。。这个评论不是针对你的,而是针对投反对票的人,不要留下动机。。“扔石头藏手”很酷,这不公平!你能解释一下如何使用ajax验证来实现同样的功能吗?以及如何为url字段创建一个“唯一”的验证器?使用ajax代码也是一样的。只需要根据ajax通信调整视图。
class RegistrationForm extends \yii\db\ActiveRecord  {

...

public function rules(){
    return [
        ['email', 'filter', 'filter' => 'trim'],
        ['email', 'email'],
        ['email', 'unique', 'targetClass' => '\common\models\Users', 'message' => 'This address is use.'],
    ];
}
public function actionRegistration() {
$model = new RegistrationForm();

if ($model->load(Yii::$app->request->post()) && $model->validate()) {           

        $db = new Users();
        $db->name = $model->name;
        $db->email = $model->email;
        $db->password = $model->password;
        $db->url = $model->url;
        $db->save();
} else {

    return $this->render('registration',
            [
                'model' => $model,
            ]
        );
}