Как проверить, что модель обновлена, вставлена ​​или удалена в Yii2 - PullRequest
0 голосов
/ 12 июня 2018

У меня есть модель в Yii.Как я могу определить, что модель Yii обновляется, вставляется или удаляется после ее сохранения ($model->save() || $model->delete())?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Если вы хотите регистрировать только то, что происходит с вашими моделями, вы можете использовать одно из расширений контрольных журналов: bedezign/yii2-audit или sammaye/yii2-audittrail

ЕслиВы хотите написать собственное поведение, которое может вас заинтересовать, свойство $dirtyAttributes, которое содержит атрибуты, которые были изменены после сохранения / выборки из базы данных.

0 голосов
/ 13 июня 2018

Самый простой способ - это проверить при сохранении.Я имею в виду, что когда вы сохраняете вашу модель, она возвращает значение true / false, а в случае false модель будет содержать массив или сообщения об ошибках.

Это самый простой способ, здесь выможет решать проблемы, отправлять оповещения, распечатывать отладочную информацию или делать что-то в отношении ошибки.

$model = new MyTable();
$model->name = example;
if($model->save()){
  //Nice its inserted/updated, go ahead
} else {
  //Woops error here, not inserted
}

Продолжайте, попробуйте.

Подробнее читайте здесь: https://www.yiiframework.com/doc/api/2.0/yii-db-baseactiverecord#save()-detail

0 голосов
/ 12 июня 2018

С помощью $model->isNewRecord вы можете проверить, будет ли модель сохранена или обновлена.С ($model->save() || $model->delete()) вы не можете напрямую определить, что произошло.Если $model->save() не удалось, то из-за ошибок проверки.$model->delete() будет называться.Это будет 1 (т. Е. Истина), если удаление прошло успешно.

Я не знаю, почему у вас есть это утверждение, но если вы по какой-то причине не можете его изменить и хотите знать, что происходит, вы можете использовать events :

$model->on(yii\db\BaseActiveRecord::EVENT_AFTER_INSERT, function(yii\db\AfterSaveEvent $e) {
    // model was inserted
});
$model->on(yii\db\BaseActiveRecord::EVENT_AFTER_UPDATE, function(yii\db\AfterSaveEvent $e) {
    // model was updated
});
$model->on(yii\db\BaseActiveRecord::EVENT_AFTER_DELETE, function(yii\base\Event $e) {
    // model was deleted
});

Если вы можете расширить класс модели, вы можете перезаписать соответствующие методы вместо того, чтобы присоединять обработчики событий.Затем вы можете создать промежуточный класс, который отвечает за то, что вам нужно сделать, и позволить извлечь любые модельные классы из этого промежуточного класса:

class ExtendedActiveRecord extends yii\db\ActiveRecord {
    public function afterSave($insert, $changedAttributes) {
        // Do anything you want
        if($insert)
            // model was inserted
        else
            // model was deleted
        parent::afterSave($insert, $changedAttributes);
    }
    public function afterDelete() {
        // Do anything you want
        parent::afterDelete();
    }
}

class ModelA extends ExtendedActiveRecord {
    ....
}
class ModelB extends ExtendedActiveRecord {
    ....
}
...