如何在Laravel中修复分组依据

时间:2019-06-04 13:07:38

标签: laravel join

我有3张桌子:

Customers = id, etc
Bikes = id, customer_id, etc
Services = id, bike_id etc

我想要这样的结果:

customer_name | customer_email | last_service | total_service

我已经在MySQL前端尝试过它,并且可以正常工作:

select c.name, c.email, max(s.created_at) as last_service, count(s.id) as total_service
from customers c
inner join bikes b
on b.id = c.id
inner join services s
on s.bike_id = b.id
group by c.id

但是在Laravel中,它给了我一个错误:

$customers = DB::table('customers')
            ->join('bikes', 'customers.id', '=', 'bikes.customer_id')
            ->join('services', 'bikes.id', '=', 'services.bike_id')
            ->select('customers.*', DB::raw('max(service.created_at) as last_service'), DB::raw('count(service.id) as total_service'))
            ->orderBy('total_service', 'desc')
            ->groupBy('customers.id')
            ->get();

我遇到这样的错误:

SQLSTATE[42000]: Syntax error or access violation: 1055 'db_safahonda.customers.customer_name' isn't in GROUP BY

在另一个相同的问题上,有些人回答要在MySQL strict to false上更改config/database.php

它适用于我的视图和dd,但是我所有的last_service仍显示相同的日期。

2 个答案:

答案 0 :(得分:0)

Laravel似乎可以使用groupBy方法的一些简写形式,但是MySQL和其他数据库需要知道如何处理其他字段。由于您选择的是*,因此可以带来很多好处。

尝试将max(customer_name)添加到select语句中,您可能需要为其他字段重复,以赋予mysql一个聚合字段的功能(字符串的最大值很愚蠢,但是它解决了这个问题,因为首先和最后一个不存在)。

答案 1 :(得分:0)

在聚合函数(max()count()等)之外选择的任何值确实需要成为group by子句的一部分。

将其他customers表列添加到group by子句将按照严格的标准(这是一个字符串列表,请参见下面的Laravel文档链接)来解决您的问题,就像选择其他所有列一样customers表中具有聚合函数的列(如另一个答案中所述)。

http://www.mysqltutorial.org/mysql-group-by.aspx https://laravel.com/docs/5.8/queries#ordering-grouping-limit-and-offset