Yii2 Дублирование модели - строка
Когда атрибуты модели редактируются или обновляются, я не хочу, чтобы эта запись обновлялась. Вместо этого следует создать новую запись и старую запись следует отключить. Также у меня есть еще одна таблица журнала, где сохраняется старая запись.
Мой код указан ниже
public function afterSave($insert, $changedAttributes)
{
if ($insert) {
// Да это новая запись (insert)
$model = new Test3log();
$model->desc = $this->desc ;
$model->id_old = $this->id;
$model->isdisabled=1;
$model->save();
} else {
$save = "";
foreach ($changedAttributes as $change => $val) {
if (trim($val) != trim($this->{$change})) {
$save .= $this->attributeLabels()[$change] . '[' . $val . '->' . $this->{$change} . "]\n";
}
}
$xx =$this->getoldattributes();
if ($save != "") {
// Get Old data
// Get New data
// repl new record with old id
// repl old record with new id
$modelnewline = new Test3();
$modelnewline->desc = $xx['desc'];
$modelnewline->id_old = $xx['id'];
$modelnewline->id = NULL;
$modelnewline->isdisabled = 1;
$modelnewline->save();
$newid = $modelnewline->id;
$oldid =$this->id;
$this->isdisabled=1;
$this->id = $newid;
$this->desc = $changedAttributes['desc'];
$this->save(false);
}
}
parent::afterSave($insert, $changedAttributes);
}
1 ответ
Ваш вопрос слишком широкий, и вы не упомянули, с какой именно проблемой вы сталкиваетесь в настоящее время, но, учитывая, что вы новичок в сообществе, я постараюсь ответить на него так, чтобы вы могли соответствующим образом перевести его.
Прежде всего, проблема, которую вы описали, должна быть реализована в вашей модели. beforeSave()
который вызывается в начале вставки или обновления записи, а не afterSave()
поскольку ваша запись уже будет обновлена новыми значениями, и вы определенно не хотите этого делать.
Согласно вашим требованиям
когда атрибуты модели редактируются или обновляются, я не хочу, чтобы эта запись обновлялась. Вместо этого следует создать новую запись и старую запись следует отключить. Кроме того, у меня есть еще одна таблица журнала, где сохраняется старая запись.
Таким образом, есть 3 основных момента, когда атрибуты меняются для существующей записи
- Отключите текущую запись, обновив статус до 0.
- Добавить новую запись, содержащую новые значения.
- Добавьте новую запись со старыми значениями в таблицу резервных копий или журналов.
Я не буду добавлять реальный код, так как информации о том, какие модели взаимодействуют, не так много, поэтому, учитывая требования, я буду использовать сценарий, в котором я буду предполагать, что у меня есть книги, и всякий раз, когда название книги меняется или обновляется следует добавить новую запись с новыми значениями и сохранить старую запись, как при изменении status
столбец к 0
так что книга отключена и сделайте резервную копию старых значений BooksBackup
Таблица. Таким образом, в основном у вас будет каркас, чтобы настроить ваш код соответственно.
Вы можете использовать логику в соответствии с моделями, которые вы используете.
Ниже приведен пример схемы
Books
модельname varchar(255)
status tinyint(1)
BooksBackup
модельid int(11)
book_id int(11)
name varchar(255)
Я добавлю следующее beforeSave()
функция в моем Books
модель
public function beforeSave($insert) {
if( !parent::beforeSave($insert) ){
return false;
}
//your custom code
if( !$insert ){
$ifAttributesChanged = (!empty($this->dirtyAttributes) );
//if attributes were changed
if( $ifAttributesChanged ){
//add new record with the new values
$book = new self();
$book->attributes = $this->attributes;
$book->save();
//add back the old values of the changed attributes
//to the current record so nothing is changed for the current record
foreach( $this->dirtyAttributes as $attribute => $value ){
$this->$attribute = $this->oldAttributes[$attribute];
}
//disable the current record
$this->status = 0;
//backup old record
$backup = new BackupBooks();
$backup->book_id = $this->id;
$backup->name = $this->name;
$backup->save();
}
}
return true;
}