You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含关联、统计、分组的原生SQL改写为Laravel Eloquent查询?

正确查询实现方案

方案1:贴近原生SQL的ORM写法

直接在Order查询中显式关联经理对应的users表,明确指定字段所属表避免歧义:

return Order::join('users', 'orders.manager_id', '=', 'users.id')
    ->selectRaw('COUNT(orders.id) as order_total, users.name as manager_name')
    // 若MySQL开启严格模式,需将所有非聚合查询字段加入groupBy
    ->groupBy('users.id', 'users.name')
    ->get();

查询结果会包含order_total(订单统计数)和manager_name(经理姓名)两个字段,和你原生SQL的返回结果完全一致。

方案2:更符合Eloquent规范的反向关联写法

先在User模型中添加经理和订单的反向关联:

// app/Models/User.php 中新增关联方法
public function managedOrders()
{
    return $this->hasMany(Order::class, 'manager_id');
}

之后直接通过User模型查询即可,无需手写join和groupBy:

// 返回所有用户作为经理的订单统计,每个实例自带managed_orders_count统计字段
return User::select('id', 'name')->withCount('managedOrders')->get();

原写法报错原因

你之前的代码没有手动声明关联users表,Eloquent不会自动拼接关联表的查询逻辑,同时name字段没有指定所属表,就算同时关联了两个users关联也会触发字段歧义错误。

内容的提问来源于stack exchange,提问作者boguchar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:24:05