当一个模型属性被编辑或更新时,我不希望那个记录被更新。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);
}
字符串
1条答案
按热度按时间w7t8yxp51#
最重要的是,你描述的问题需要在你的模型的
beforeSave()
中实现,它在插入或更新记录的开始被调用,而不是afterSave()
,因为你的记录已经用新值更新了,你肯定不想这样做。按您的要求。
当一个模型属性被编辑或更新时,我不希望那个记录被更新。2相反,一个新的记录应该被创建,旧的记录应该被禁用。3另外,我有另一个日志表,旧的记录保存在那里。
因此,当现有记录的属性发生变化时,
我不会添加实际的代码,因为没有太多关于哪些模型是交互的信息,所以在查看需求时,我将使用这样的场景:我将假设我有书籍,每当书籍的名称被更改或更新时,它应该添加一个具有新值的新记录,并保留旧记录,因为将
status
列更改为0
,以便书籍禁用并将旧值备份到BooksBackup
表中。所以基本上你会有一个线框来相应地调整你的代码。您可以根据您正在使用的模型使用逻辑。
下面是示例模式
Books
型号name varchar(255)
个status tinyint(1)
个BooksBackup
型号id int(11)
book_id int(11)
个name varchar(255)
我将在我的
Books
模型中添加以下beforeSave()
函数字符串