Php 如何使用Yii2检查数据库中是否存在数据?
我正在学习Yii2,我正在尝试注册我的Yii基础项目。问题是,我无法检查数据库中用户输入的某些数据(在我的例子中是电子邮件和url)是否存在,从而为每个用户生成唯一的电子邮件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
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,
]
);
}