Yii2模型重复-行

时间:2018-08-19 11:43:41

标签: logging yii2 save audit trail

当编辑或更新模型属性时,我不想更新该记录。而是应创建一个新记录,并禁用旧记录。 另外我还有另一个保存旧记录的日志表。

我的代码如下

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 个答案:

答案 0 :(得分:0)

您的问题太过广泛,您还没有提到您当前所面对的问题到底是什么,但是考虑到您是社区的新手,我将尝试以可以相应翻译的方式回答问题。

首先,您描述的问题需要在模型的beforeSave()中实现,而该问题在插入或更新记录的开始即被调用,而不是afterSave(),因为您的记录已经被更新了新的价值观,您肯定不想这么做。

根据您的要求。

  

当模型属性被编辑或更新时,我不希望那样   记录进行更新。相反,应创建新记录,而旧记录   记录应被禁用。另外,我还有另一个日志表   记录已保存。

当现有记录的属性发生更改时,主要有三件事

  • 通过将状态更新为0来禁用当前记录。
  • 添加包含新值的新记录。
  • 在备份或日志表中添加具有旧值的新记录。

我将不添加实际的代码,因为没有太多有关交互模型的可用信息,因此在查看需求时,我将使用以下场景:我假设我有书,并且只要书名是更改或更新它时,应添加具有新值的新记录,并按将status列更改为0的方式保留旧记录,以便禁用该书并将旧值备份到{{1} }表。因此,基本上,您将可以使用线框来相应地调整代码。

您可以根据所使用的模型使用逻辑。

下面是示例架构

  • BooksBackup模型

    • Books
    • name varchar(255)
  • status tinyint(1)模型

    • BooksBackup
    • id int(11)
    • book_id int(11)

我将在name varchar(255)模型中添加以下beforeSave()函数

Books