如何知道 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】:
您可以使用返回 bool
的 isDirty()
方法和返回带有更改值的 array
的 getDirty()
。
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 模型值是不是在保存回调时更改的主要内容,如果未能解决你的问题,请参考以下文章