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

更新日期: 2019-01-24 阅读次数: 2149 分类: 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年08月23日 处暑
2019年09月03日 抗日胜利纪念日
2019年09月08日 白露
2019年09月08日 国际扫盲日
2019年09月10日 教师节
2019年09月13日 中秋节
2019年09月16日 国际臭氧层保护日
2019年09月16日 世界清洁地球日
2019年09月18日 "九一八"事变纪念日
2019年09月20日 国际爱牙日
2019年09月21日 国际和平日
2019年09月22日 世界无车日
查看更多节日