首页 > 解决方案 > Laravel eloquent 更新记录的最小值

问题描述

我需要找到最小的“优先级”值,然后使用 laravel eloquent 将它的值设置为另一个条目。

有什么办法可以做到这一点或有什么最佳做法吗?

我的想法:

Orders::where('user_id', '!=', $user_id)
 ->where('odm_id', $odm_id)
 ->whereExpired(0)
 ->min('priority')
 ->update(['priority' => 1]);

仅供参考:上述方法给出错误并且不起作用。错误消息是:

Call to a member function update() on string

标签: phpmysqllaravelormeloquent

解决方案


问题是min它将返回一个数字而不是实际模型。如果您想要具有最小值的实际模型,则需要:

Orders::where('user_id', '!=', $user_id)
        ->where('odm_id', $odm_id)
        ->wherePriority(function ($query) use ($user_id, $odm_id) {
        $query->from(\DB::raw('(SELECT * FROM orders) AS o'))
              ->selectRaw("MIN(`o`.`priority`)")                   
              ->where('o.odm_id', $odm_id)
              ->where('o.expired', 0);
        })->update(['priority' => 1]);

请注意,这将更新所有已过期 0 的记录,odm_id等于$odm_id并匹配最小值。

或者,您可以这样做:

$orders =Orders::where('user_id', '!=', $user_id)
        ->where('odm_id', $odm_id)
        ->wherePriority(function ($query) use ($user_id, $odm_id) {
        $query->from(\DB::raw('(SELECT * FROM orders) AS o'))
              ->selectRaw("MIN(`o`.`priority`)")                   
              ->where('o.odm_id', $odm_id)
              ->where('o.expired', 0);
        })->get();

  $orders->each(function ($order) {
       $order->priority = 1;
       $order->save();
  });

第二种方式的缺点是要执行 2 个单独的查询,一个是获取数据,一个是更新,但是这具有触发模型事件(例如保存等)的优点。


推荐阅读