Laravel雄辩的更新记录,最小值

时间:2018-08-21 07:55:30

标签: php mysql laravel orm eloquent

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

是否有任何方法或最佳做法?

我的想法:

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

1 个答案:

答案 0 :(得分:1)

问题在于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();
  });

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