Laravel连接表并获得用户的最大订单

时间:2017-09-06 11:57:43

标签: php laravel web laravel-eloquent laravel-query-builder

我有2个模型OrdersUsers,我想获得订购最多的用户列表总和金额

表格结构

  //users
    id  name  phone_number  
    1   John  1111111111
    2   Mike  2222222222

  //orders
    id  user_id  total 
    1     1      500  
    2     1      450
    3     2      560
    4     1      850
    5     2      500

  //expected result 
    name  phone_number  orders  amount 
    John  1111111111      3      1800
    Mike  2222222222      2      1060

尝试以下查询

$privilaged_users = User::leftJoin('orders', 'orders.user_id', 'users.id')
                        ->select('name','phone_number')
                        ->max('orders.user_id as orders')
                        ->groupBy('orders.user_id')
                        ->get();

获取以下错误

    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
 your SQL syntax; check the manual that corresponds to your MySQL server version
 for the right syntax to use near 'as `orders`) as aggregate from `users` left 
join `orders` on `orders`.`user_id` ' at line 1 (SQL: select 
max(`orders`.`user_id` as `orders`) as aggregate from `users` left join `orders`
 on `orders`.`user_id` = `users`.`id` where `users`.`deleted_at` is null)

谢谢

2 个答案:

答案 0 :(得分:2)

您可以将此查询编写为

$privilaged_users = User::leftJoin('orders', 'orders.user_id',"=", 'users.id')
                    ->select('name','phone_number',DB::raw('max(orders.total) as orders_total'))
                    ->groupBy('orders.user_id')  
                    ->get();

作为原始查询,因为默认情况下它会将整个字符串视为列

编辑

你的问题是,你在聚合函数内部的字段上进行分组。

以下是一些解释my concern much better的链接。

我已对代码进行了更改。请检查一次。

答案 1 :(得分:1)

SELECT MAX(field AS something)语法无效。试试这个:

$privilaged_users = User::leftJoin('orders', 'orders.user_id', 'users.id')
                        ->select('name','phone_number', DB::raw('max(orders.user_id) AS orders_total'), 'orders.user_id')
                        ->groupBy('orders.user_id')
                        ->get();

并将MAX字段称为"聚合"