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

文章目录

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

    要满足这个需求,就需要能知道订单 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式