laravel用最小值雄辩地更新记录

tp5buhyn  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(276)

我需要找到最小的“优先级”值,然后将它的值设置为另一个条目,使用laravelelelounk。
有没有什么办法或最佳做法?
我的想法是:

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
ruarlubt

ruarlubt1#

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

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

相关问题