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

更新日期: 2019-01-24 阅读次数: 387 分类: 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年02月24日 第三世界青年日
2019年02月28日 世界居住条件调查日
2019年03月01日 国际海豹日
2019年03月03日 全国爱耳日
2019年03月05日 学雷锋日
2019年03月06日 惊蛰
2019年03月08日 三八妇女节
2019年03月08日 龙抬头
2019年03月12日 植树节
2019年03月14日 白色情人节
2019年03月15日 消费者权益日
2019年03月17日 国际航海日
查看更多节日