Yii2, как сохранить старую информацию в таблицу истории?

спасибо всем участникам stackoverflow, я многому научился здесь.

У меня есть вопрос о «beforeSave», я хочу сохранить старые данные в таблице истории в базе данных, например, если пользователь изменит что-либо, я хочу сохранить старую информацию в таблице истории.

Может ли кто-нибудь сказать мне, что такое «лучший» сценарий для достижения этого?

Спасибо всем и все предложения приветствуются.


person Andy    schedule 04.09.2017    source источник


Ответы (2)


Вы должны добавить функцию beforSave() в свою модель.
Проверьте, является ли параметр $insert ложным, это означает, что вы обновляете запись, поэтому в этом случае вы можете создать новую HistoryModel, изменить и сохранить

  public function beforeSave($insert)
  {
      if(parent::beforeSave($insert))
      {
          if(! $insert)
          {
              $historyModel = new History();
              $historyModel->att1 = $this->att1;
              $historyModel->att2 = $this->att2;
              ......
              $historyModel->attN = $this->attN;
              $historyModel->save();
              return true;
          }

      }

http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#beforeSave%28%29-detail

person scaisEdge    schedule 04.09.2017
comment
@scaiEdge, мне нужен контроллер или только модель? - person Andy; 04.09.2017
comment
действие beforeAction должно быть помещено в модель, потому что оно определено в классе activeRecord. Функция, описанная в документе yiiframework.com/doc-2.0/ при вызове EVENT_BEFORE_UPDATE при вызове model-›save() ...Обычно model-›save() используется в действии, поэтому с помощью actionUpdate функция автоматически вызывается фреймворком.. надеюсь, это понятно.. и если мой ответ правильный, отметьте его как принятый... см. здесь meta.stackexchange.com/questions/5234/ - person scaisEdge; 04.09.2017
comment
не сохранять в БД модель historyModel? - person scaisEdge; 05.09.2017
comment
вы можете попробовать использовать $historyModel-›save(false); для отключения проверки значения сохраняются, а затем проверяются правила проверки - person scaisEdge; 05.09.2017
comment
еще раз большое спасибо :-) это работает как шарм :-) - person Andy; 05.09.2017

Для всех остальных, кто хочет сохранить только изменения в базе данных, вот код:

  public function afterSave($insert, $changedAttributes) {
    parent::afterSave($insert, $changedAttributes);
    if(!$insert) {
        $historyModel = new History();
        if(isset($changedAttributes['attr1']  )){
            $historyModel->attr1 = $changedAttributes['attr1'];
        }
        ...
        $historyModel->save(false);
    }
}

Теперь вы можете каждый раз сохранять только изменения в базе данных, а не все записи...

person Andy    schedule 06.09.2017