php – Yii on update,检测是​​否在beforeSave()上更改了特定的AR属性

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – Yii on update,检测是​​否在beforeSave()上更改了特定的AR属性脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我在模型的beforeSave上引发了一个Yii事件,只有在模型的特定属性发生变化时才会触发该事件.

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

这就是我现在所拥有的(注意我的表没有PK,这就是我查询所有属性原因,除了我要比较的那个 – 因此未设置的函数):

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 on update,检测是​​否在beforeSave()上更改了特定的AR属性全部内容,希望文章能够帮你解决php – Yii on update,检测是​​否在beforeSave()上更改了特定的AR属性所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。