php - Laravel eloquent 更新记录的最小值
问题描述
我需要找到最小的“优先级”值,然后使用 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
解决方案
问题是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 个单独的查询,一个是获取数据,一个是更新,但是这具有触发模型事件(例如保存等)的优点。
推荐阅读
- r - 如何根据条件用 igraph 更改 R 中的 vertex.shape
- microservices - 在一台机器上运行多个 Quarkus 实例
- c# - 在项目列表上设置序列
- python - Django 突然错误:“AuthMissingParameter at /complete/google-oauth2/”,当使用来自 social-auth-app-django 包的 GoogleOAuth2 时
- python - 如何修复错误:“无法挤压 dim[1],预期维度为 1,得到 2 [[{{node Squeeze}}]] [Op:IteratorGetNext]”
- oauth - 如何将角色从 Keycloak 映射到外部数据库?
- python - 如何访问 DataFrame 中的值,其中 df.columns 值的字符串以“.L”结尾
- python - “./file.py” VS “python 文件.py”
- php - 将天添加到空数据库时间
- flutter - 如何为子集合firestore颤振自动创建字段