我需要找到最小的“优先级”值,然后使用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
答案 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();
});
第二种方法的缺点是执行两个单独的查询,一个查询获取数据,一个更新,但这具有触发模型事件(例如保存等)的优点。