ITwoolf
@ITwoolf

Как заставить afterSave сохранять старые данные, которые были изменены в 1 табличке — в другую?

Добрый день. Вот у меня есть табличка Kniga1 со своей моделью Kniga1.php. В данной табличке есть свои поля. Описание книги и т.д. Я создал вторую табличку для того, что бы если в первой поменять описание книги, то оно сохранилось во второй табличке. Я уже понял, что мне нужно использовать функцию afterSave.
public function afterSave($insert, $changedAttributes){
parent::afterSave($insert, $changedAttributes);

???
}

Но что мне конкретно прописать, что бы данная связь сработала? Кстати обычную стандартную связь между таблицами я сделал. one to many и many to one.

5c87b7b18c57d978739620.png
  • Вопрос задан
  • 465 просмотров
Решения вопроса 3
Delgus
@Delgus
Так например
public function beforeSave($insert)
{
    if (!parent::beforeSave($insert)) {
        return false;
    }
    $description = new Description();
    $description->book_id = $this->id;
    $description->old_text = $this->text;
    $description->created_at = time();
    $description->save();
    return true;
}
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Я создал вторую табличку для того, что бы если в первой поменять описание книги, то оно сохранилось во второй табличке.

Это лишено смысла или не верно сформулировано. Вы хотите иметь backUp первой таблицы? Тогда вторая таблица просто должна хранить историю изменений. В простом варианте это
id | date_update | book_id | user_id | data
в дата просто json в котором слепок того что было до изменения. И тогда Вам надо не afterSave, а beforeSave где еще есть старые данные
Ответ написан
Комментировать
ITwoolf
@ITwoolf Автор вопроса
Большое всем спасибо за помощь! смог решить проблему с п помощью данного кода:
Может понадобится кому)

public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);

if ($changedAttributes['description']){//если изменилось описание (если не изменилось записи description в массиве со старыми значениями не будет)
$description = new Description(); //создание объекта

$description->creation_date =date("Y-m-d H:i:s");//дата изменения (прям сейчас). creation_date поставь свое значение
$description->id_kniga1 = $this->id;//устанавливаем значение ИД книги. id_kniga1 поставь свое значение
$description->description = $changedAttributes['description'];//старое описание. description поставь свое описание

$description->save();//сохраням объект (иделаем запись в базу)
}
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hostadmin
@hostadmin
Если вам нужна история изменений, то посмотрите в сторону этого компонента https://github.com/bupy7/yii2-activerecord-history
Просто добавляете в behaviors нужной модели и автоматически её история сохраняется в отдельную таблицу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы