我设置了一个登录过程,在该过程中生成验证码,成功后删除验证码。然而,我想确保,如果同一用户有多个验证码,登录成功后,删除该用户的所有记录。
这是我的代码
if ($model->validate() && $model->login()) {
//delete this verification code
$verificationCode->delete();
//delete all existing codes for user_id
VerificationCode::model()->deleteAll('user_id',$user->id);
Yii::app()->user->setReturnUrl(array('/system/admin/'));
$this->redirect(Yii::app()->user->returnUrl);
}
然而,这似乎只是删除了所有记录,而不考虑表中不同的user_id。有人看到我哪里错了吗?
如果要删除具有指定属性的记录,最干净的方法是使用deleteAllByAttributes()
:
VerificationCode::model()->deleteAllByAttributes(['user_id' => $user->id]);
似乎您以错误的方式调用了函数delete()。。。尝试以这种方式传递值
VerificationCode::model()->deleteAll('user_id = :user_id', array(':user_id' => $user->id));
对于Yii2,记录的方法是使用函数deleteAll()
。
我通常将参数作为数组传递,如下所示:
VerificationCode::deleteAll(['user_id' => $user->id]);
此外,您可以使用afterDelete
方法,以确保每次或任何地方有人删除一个验证代码,您的应用程序也会删除每个用户验证代码。将其放入您的验证代码模型类:
protected function afterDelete()
{
parent::afterDelete();
VerificationCode::model()->deleteAll('user_id = :user:id',[':user_id' =>$this->user_id]);
//... any other logic here
}
您可以使用以下方法从数据库中删除所有user_id条目:
$criteria = new CDbCriteria;
// secure way for add a new condition
$criteria->condition = "user_id = :user_id ";
$criteria->params[":user_id"] = $user->id;
// remove user related all entry from database
$model = VerificationCode::model()->deleteAll($criteria);
或者您可以在控制器操作中直接使用另一种方法
VerificationCode::model()->deleteAll("user_id=:user_id",[":user_id"=>$user->id]);
使用以下方法重定向URL
$this->c()->redirect(Yii::app()->createUrl('/system/admin/'));