如何将含关联、统计、分组的原生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
相关产品推荐
相关产品推荐

