grhmstwrt
grhmstwrt

Reputation: 341

Yii deleteAll() records with condition

I've set up a log in process where a verification code is generated, and when successful, is then removed. However, i want to make sure that if there's multiple verification codes for the same user, upon log in success, delete all records for that user.

Here's my code

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);
}

However, this seems to just delete all the records, regardless on different user_id's in table. Can anyone see where I'm going wrong?

Upvotes: 4

Views: 19803

Answers (5)

nunorbatista
nunorbatista

Reputation: 875

For Yii2, the documented way is to use the function deleteAll().

I normally pass the arguments as an array, like so:

VerificationCode::deleteAll(['user_id' => $user->id]);

Upvotes: 2

ScaisEdge
ScaisEdge

Reputation: 133380

Seems you call the function delete() in wrong way ... try passing value this way

VerificationCode::model()->deleteAll('user_id = :user_id', array(':user_id' => $user->id));

Upvotes: 2

Viral Nakrani
Viral Nakrani

Reputation: 11

You can use below method for deleting all user_id entry from database:

$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);

or you can use another method directly in controller action

VerificationCode::model()->deleteAll("user_id= :user_id", [":user_id" =>$user->id]);

use below method for redirecting a URL

$this->c()->redirect(Yii::app()->createUrl('/system/admin/'));

Upvotes: -1

rob006
rob006

Reputation: 22174

If you want to delete record with specified attributes, the cleanest way for this is to use deleteAllByAttributes():

VerificationCode::model()->deleteAllByAttributes(['user_id' => $user->id]);

Upvotes: 6

Felippe Duarte
Felippe Duarte

Reputation: 15131

Also, you can use the afterDelete method, to make sure that everytime or everywhere someone deletes one verificationCode, your application will also delete every userVerificationCode. Put this in your verificationCode model class:

protected function afterDelete()
{
    parent::afterDelete();
    VerificationCode::model()->deleteAll('user_id = :user:id',[':user_id' =>$this->user_id]);
    //... any other logic here
}

Upvotes: 0

Related Questions