Fahad Ali
Fahad Ali

Reputation: 124

how to run custom code after every $model->save() function in yii2

I want to execute my custom code after or before every $model->save() in Yii2.

I want to perform this globally like using components, etc.

I want to create a user activity log to store how many times a user insert or update any rows in database table, so for this I want to run some code when ever data inserted or update in tables.

Any help or suggestion will appreciated.

Upvotes: 3

Views: 2185

Answers (3)

Yasar Arafath
Yasar Arafath

Reputation: 625

Create new class(MyActiveRecord) which extends \yii\db\ActiveRecord

Use extends MyActiveRecord to all your project models

Ex:

class MyActiveRecord extends \yii\db\ActiveRecord
{ 

 public function afterSave($insert, $changedAttributes){
    //This will called after every model saved

  return parent::beforeSave($insert,$changedAttributes);
 }




}

In your project other models

class Customer extends app\models\MyActiveRecord
{ 



}

Upvotes: 1

Pedro del Sol
Pedro del Sol

Reputation: 2841

As @patryk mentioned ActiveRecord has beforeSave and afterSave methods.

I use something like the following to store a created date for new records (and updated date when existing records are updated). The code in the example is, of course, trivial but it allows you to use any arbitrary code you need, see the layout and how to split code for 'new' records and existing.

This overridden method can be added to any model class which extends ActiveRecord to allow the parent beforeSave to be called correctly also.

/**
 * @inheritdoc
 */
public function beforeSave($insert)
{
    if ($insert) {
        // This is a new instance of modelClass, run your 'insert' code here.
        $this->created_date = time();
    }
    // Anything else will be run any time a model is saved.
    $this->updated_date = time();

    return parent::beforeSave($insert);
}

edited to add: if the code to be run is the same for each model you could create a trait and use the trait in each model to allow you to change the behaviour in one place. Or create a custom ActiveRecord class to override the beforeSave method for each subclass.

Upvotes: 1

user7242866
user7242866

Reputation:

Yii2 ActiveRecord class has beforeSave and afterSave methods. https://github.com/yiisoft/yii2/blob/master/framework/db/BaseActiveRecord.php#L926

But maybe it would be better to do such operation on database triggers?

Upvotes: 0

Related Questions