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

Posted

技术标签:

【中文标题】如何知道 laravel 模型值是不是在保存回调时更改【英文标题】: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 这听起来有点矫枉过正.. 一个骇人听闻的矫枉过正 【参考方案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"); @abbood nope,不需要参数,github.com/laravel/framework/blob/master/src/Illuminate/… 我们在看两个不同的版本,你指的是 4.1+,我看的是4.0 啊,好吧,你没有提到,所以我以为你使用的是最新的,如果你不想使用isDirty('status'),你也可以像在 4.1 中那样使用count(getDirty()) > 0。跨度> 没错,你的回答对我有帮助。毕竟我给了你一个正确的答案;)【参考方案2】:

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

【讨论】:

以上是关于如何知道 laravel 模型值是不是在保存回调时更改的主要内容,如果未能解决你的问题,请参考以下文章

在选择选项 laravel 上保存名称值而不是 id

如何在更新 Laravel 中的记录时将表单发布数据加载到模型中

Laravel 类型提示,模型保存时 id 返回 null

laravel 检索值匹配数据透视表的所有用户

如何显示Laravel Nova中的加密字段值?

如何在 Laravel 模型上设置属性的默认值 [重复]