问题 如何知道laravel模型值是否在保存回调时更改


以下 这个 回答,我在Laravel模型中保存回调(类似于rails),如下所示:

class LessonPlan extends Eloquent {

   public function save(array $options = array())
   {
      // before save code 
      parent::save();
      // after save code
   }
}

但是,我打电话给save() Page 当我保存一个  页面或更新 现有 一。我怎么知道这个操作中哪个是哪个?

我尝试过类似的东西

public function save(array $options = array())
{
    // before save code
    $oldLesson = clone $this;
    parent::save();

    ..
    if ($this->isLessonStatusChanged($oldLesson)) {
      ..
    }
}

private function isLessonStatusChanged($oldLesson) {
    return $this->status != $oldLesson->status;
}

但这并不好......因为$ oldLesson已经有了$ lesson的新值

我最终做的只是重新编写网址以查看它是否是更新请求..但我已经在晚上睡觉时遇到了问题(我的回答并没有真正告诉我是否有任何值实际发生了变化.. b / c one可以提交更新表格,而无需实际更改任何内容)..有更清洁的方法吗?


12246
2018-04-16 11:38


起源

但为什么呢 $oldLesson 应该有新值,如果你只是克隆对象,但没有引用它..? - vikingmaster
我想知道同样的事情@Jari ..我假设在这里保存只意味着数据库事务或其他东西..我并不暗示它之前的东西会有项目的旧值..然后我又是没有Laravel专家 - abbood
你可以做的是在这里问人们实时聊天: laravel.io/chat 甚至Taylor Otwell(laravel的创造者)也经常在线。 - vikingmaster
您是否考虑过使用Event :: fire()和(在哪里想要监听它)在parent :: save之前或之后的事件:: listen()? - alou
@alou听起来有点像矫枉过正..这是一个hacky矫枉过正 - abbood


答案:


你可以使用 isDirty() 返回a的方法 bool 和 getDirty() 返回一个 array 改变了价值观。

public function save(array $options = array())
{
    $changed = $this->isDirty() ? $this->getDirty() : false;

    // before save code
     parent::save();

    // Do stuff here
    if($changed)
    {
        foreach($changed as $attr)
        {
            // My logic
        }
    }

}

14
2018-04-16 12:37



你的 isDirty() 缺少参数..这就是我做的: return $this->isDirty("status"); - abbood
@abbood nope,不需要参数, github.com/laravel/framework/blob/master/src/Illuminate/... - afarazit
我们正在看两个不同的版本,你指的是4.1+,我正在看 4 - abbood
好吧,你还没有提到,所以我认为你使用的是最新的,如果你不想使用的话 isDirty('status') 你也可以这样做 count(getDirty()) > 0 像4.1中一样。 - afarazit
你的回答很有帮助我很好......毕竟我给了你一个正确的答案;) - abbood


你有没有尝试过 Model::getDirty()?我自己没有尝试过,但它返回自上次同步以来已更改的属性。 请参阅API文档


0
2018-04-16 12:26