【问题标题】:how to know if laravel model values changed on save callback如何知道 laravel 模型值是否在保存回调时更改
【发布时间】:2014-05-31 06:17:29
【问题描述】:

按照this 的回答,我在 Laravel 中进行模型保存回调(类似于 rails),如下所示:

class LessonPlan extends Eloquent {

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

但是,当我保存 页面或更新 现有 页面时,我会在 Page 上调用 save()。我怎么知道在这个操作中哪个是哪个?

我尝试了类似的东西

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 的新值

我最终做的只是对 url 进行正则表达式以查看它是否是更新请求.. 但我已经在晚上难以入睡(我的回答并没有真正告诉我是否有任何值实际上发生了变化.. b /c 可以在不实际更改任何内容的情况下提交更新表单).. 有没有更简洁的方法?

【问题讨论】:

  • 但是为什么$oldLesson 应该有新值,如果你只是克隆对象,而不是引用它..?
  • 我想知道同样的事情@Jari ..我假设在这里保存仅意味着数据库事务或其他东西..我并不暗示它之前的内容将具有旧值item.. 再说一次,我不是 Laravel 专家
  • 您可以在这里在线聊天:laravel.io/chat 甚至 Taylor Otwell(laravel 的创建者)也经常在线。
  • 您是否考虑过在 parent::save 之前或之后使用 Event::fire() 和(无论您想在哪里收听)Event::listen() ?
  • @alou 这听起来有点矫枉过正.. 一个骇人听闻的矫枉过正

标签: php regex laravel laravel-4


【解决方案1】:

您可以使用返回 boolisDirty() 方法和返回带有更改值的 arraygetDirty()

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
        }
    }

}

【讨论】:

  • 您的 isDirty() 缺少参数。这就是我所做的:return $this->isDirty("status");
  • 我们在看两个不同的版本,你指的是 4.1+,我看的是4.0
  • 啊,好吧,你没有提到,所以我以为你使用的是最新的,如果你不想使用isDirty('status'),你也可以像在 4.1 中那样使用count(getDirty()) > 0。跨度>
  • 没错,你的回答对我有帮助。毕竟我给了你一个正确的答案;)
【解决方案2】:

你试过Model::getDirty()吗?我自己没有尝试过,但它返回自上次同步以来已更改的属性。 See the API docs.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 2013-09-22
    • 2018-04-17
    • 2012-11-11
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多