Yii deleteAll()记录带有条件


Yii deleteAll() records with condition

我设置了一个登录过程,在该过程中生成验证码,成功后删除验证码。然而,我想确保,如果同一用户有多个验证码,登录成功后,删除该用户的所有记录。

这是我的代码

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/'));