php Yii 2模型重复-行

dzjeubhm  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(98)

当一个模型属性被编辑或更新时,我不希望那个记录被更新。2相反,一个新的记录应该被创建,旧的记录应该被禁用。3我还有另一个日志表,旧的记录保存在那里。
我的代码如下

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);
    }

字符串

w7t8yxp5

w7t8yxp51#

最重要的是,你描述的问题需要在你的模型的beforeSave()中实现,它在插入或更新记录的开始被调用,而不是afterSave(),因为你的记录已经用新值更新了,你肯定不想这样做。
按您的要求。
当一个模型属性被编辑或更新时,我不希望那个记录被更新。2相反,一个新的记录应该被创建,旧的记录应该被禁用。3另外,我有另一个日志表,旧的记录保存在那里。
因此,当现有记录的属性发生变化时,

  • 通过将状态更新为0来禁用当前记录。
  • 添加一个保存新值的新记录。
  • 在备份或日志表中添加一个新的记录和旧的值。

我不会添加实际的代码,因为没有太多关于哪些模型是交互的信息,所以在查看需求时,我将使用这样的场景:我将假设我有书籍,每当书籍的名称被更改或更新时,它应该添加一个具有新值的新记录,并保留旧记录,因为将status列更改为0,以便书籍禁用并将旧值备份到BooksBackup表中。所以基本上你会有一个线框来相应地调整你的代码。
您可以根据您正在使用的模型使用逻辑。
下面是示例模式

  • Books型号
  • name varchar(255)
  • status tinyint(1)
  • BooksBackup型号
  • id int(11)
  • book_id int(11)
  • name varchar(255)

我将在我的Books模型中添加以下beforeSave()函数

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;
}

字符串

相关问题