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

更新日期: 2019-01-24 阅读次数: 11470 分类: 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",
   ]

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式