gpt4 book ai didi

php - Yii 更新时,检测特定 AR 属性是否已在 beforeSave() 上更改

转载 作者:可可西里 更新时间:2023-11-01 12:45:29 24 4
gpt4 key购买 nike

我在模型的 beforeSave 上引发了一个 Yii 事件,只有在模型的特定属性发生更改时才会触发该事件。

目前我能想到的唯一方法是创建一个新的 AR 对象并使用当前的 PK 在数据库中查询旧模型,但这不是很好的优化。

这是我现在拥有的(请注意,我的表没有 PK,这就是我查询所有属性的原因,除了我正在比较的属性 - 因此 unset 函数):

public function beforeSave()
{
if(!$this->isNewRecord){ // only when a record is modified
$newAttributes = $this->attributes;
unset($newAttributes['level']);
$oldModel = self::model()->findByAttributes($newAttributes);

if($oldModel->level != $this->level)
// Raising event here
}
return parent::beforeSave();
}

有更好的方法吗?也许将旧属性存储在 afterFind() 中的新本地属性中?

最佳答案

您需要将旧属性存储在 AR 类的本地属性中,以便您可以随时将当前属性与那些旧属性进行比较。

第 1 步。向 AR 类添加一个新属性:

// Stores old attributes on afterFind() so we can compare
// against them before/after save
protected $oldAttributes;

第 2 步。覆盖 Yii 的 afterFind() 并在检索到原始属性后立即存储它们。

public function afterFind(){
$this->oldAttributes = $this->attributes;
return parent::afterFind();
}

第 3 步。比较 beforeSave/afterSave 或 AR 类中您喜欢的任何其他地方的新旧属性。在下面的示例中,我们正在检查名为“level”的属性是否已更改。

public function beforeSave()
{
if(isset($this->oldAttributes['level']) && $this->level != $this->oldAttributes['level']){

// The attribute is changed. Do something here...

}

return parent::beforeSave();
}

关于php - Yii 更新时,检测特定 AR 属性是否已在 beforeSave() 上更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18461503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com