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;
}
Другие вопросы по тегам