Laravel model save 时判断指定字段是否发生更改

更新日期: 2019-01-24 阅读次数: 1009 分类: Laravel

需求场景,当订单表中的快递公司,或者快递单号发生改变时,更新快递表中的相关字段。

要满足这个需求,就需要能知道订单 Model 更新时,是否修改了这两个字段。

解决方法是使用 getChanges 方法,例如:

$order->express_company =  '顺丰';
$order->save();
Log::info($order->getChanges());

[2019-01-24 09:46:01] local.INFO: array (
  'express_company' => '顺丰',
  'updated_at' => '2019-01-24 09:46:00',
)

然后就可以加对应的判断逻辑了

if (array_key_exists('express_company', $changes) ||
     array_key_exists('express_id', $changes)) {
	// do something
}

getChanges 与 getDirty 的区别

  • getDirty 需要在 save 前调用
  • 而 getChanges 在 save 后调用。

在 Laravel Tinker 中测试一下:

>>> use App\Models\Order;
>>> $order = Order::find(3);
>>> $order->notes = "带两根大葱";
=> "带两根大葱"
>>> $order->getDirty();
=> [
     "notes" => "带两根大葱",
   ]
>>> $order->getChanges();
=> []
>>> $order->save();
=> true
>>> $order->getDirty();
=> []
>>> $order->getChanges();
=> [
     "notes" => "带两根大葱",
     "updated_at" => "2019-01-24 12:05:40",
   ]

爱评论不评论

近期节日

2019年04月26日 知识产权日
2019年04月30日 全国交通安全反思日
2019年05月01日 国际劳动节
2019年05月04日 五四青年节
2019年05月06日 立夏
2019年05月08日 世界红十字日
2019年05月08日 世界微笑日
2019年05月12日 国际护士节
2019年05月12日 母亲节
2019年05月12日 佛诞
2019年05月15日 国际家庭日
2019年05月17日 世界电信日
查看更多节日