【问题标题】:Laravel eloquent update record with minimum valueLaravel eloquent 更新记录的最小值
【发布时间】:2018-08-21 07:55:29
【问题描述】:

我需要找到最小的“优先级”值,然后使用 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

【问题讨论】:

  • 我觉得不错。想不出任何其他更好的方法来做到这一点。
  • @Chris 是的,它看起来不错,但它不起作用。
  • whereExpired() 函数有什么作用?
  • 这取决于您的要求。如果您只想获得最低优先级,则不要添加额外的检查。如果您的结果取决于其他列值,那么您已经采用了正确的方式。接下来,您可以通过在 Order 类中定义方法来最小化查询。
  • @Chris WhereExpired() 是使用 where('expired', 1) 的更好方法

标签: php mysql laravel orm eloquent


【解决方案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();
  });

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

【讨论】:

  • 我使用了你的方法,但问题是它给了我这个错误:“SQLSTATE [42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误;检查手册对应于您的 MySQL 服务器版本,以便在第 1 行的“where odm_id = ? and expired = ?)”附近使用正确的语法(SQL:更新 orders set priority = 1, updated_at = 2018 -08-21 08:22:19 其中user_id != 27 和odm_id = 6 和priority = (选择最小值(priority) 其中odm_id = 6 和expired = 0))"
  • @Mohammad_Hosseini 尝试像在更新中一样在嵌套选择中添加表名
  • 我已经这样做了,但它给了我这个错误:“SQLSTATE [HY000]:一般错误:1093 您不能在 FROM 子句中指定目标表“订单”进行更新(SQL:更新orders 设置priority = 1, updated_at = 2018-08-21 08:30:51 其中user_id != 27 和odm_id = 6 和priority = (选择MIN(priority ) 来自orders 其中odm_id = 6 和expired = 0))"
猜你喜欢
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
相关资源
最近更新 更多