代码之家  ›  专栏  ›  技术社区  ›  Mohammad_Hosseini

Laravel雄辩式用最小值更新记录

  •  0
  • Mohammad_Hosseini  · 技术社区  · 6 年前

    我需要找到最小的“优先级”值,然后使用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
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   apokryfos    6 年前

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

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