问题是
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();
});
第二种方法的缺点是执行两个独立的查询,一个用于获取数据,一个用于更新,但是这有触发模型事件(如保存等)的优点。