SQLSTATE [42000]:语法错误或访问冲突

SQLSTATE [42000]: Syntax error or access violation

在不禁用MySQL的严格模式的情况下进行分组,如果我禁用严格模式,则以下查询有效,但是,我不想这样做,有人可以给我更好的建议,我一直在尝试好几种方法我都做不到

抛出的错误是:SQLSTATE [42000]: 语法错误或访问冲突:... up by digital_cards``id) as aggregate_table) '

$cards = DB::table('digital_cards')
                   ->join('companies', 'digital_cards.company_id', '=', 'companies.id')
                   ->join('profiles' , 'digital_cards.profile_id', '=', 'profiles.id')
                   
                   ->join('company_services', 'companies.id', '=', 'company_services.company_id')
                   ->join('services', 'company_services.service_id', '=', 'services.id')

                   ->where('services.service', 'LIKE', "%$keyword%")
                   ->where('digital_cards.is_public', '=', 1)

                   ->groupBy('digital_cards.id');
                   ->orderBy('companies.name', 'ASC')

                   ->paginate(10);

在得到一些帮助后我找到了解决方案。

首先。为什么会弹出错误?

弹出错误是因为当您分组时,您没有定义您希望如何选择连接的列。
假设您在加入 tables (t=table, c= column) 后拥有这些列:

t1.id | t1.c1 | t1.c2 | t2.c1 | t2.c2
1.    | hello | car   | alfa  | one
2.    | bye   | bike  | alfa  | one
3.    | hello | car   | beta  | two

假设我们要按 t1.c1 分组。 SQL 不知道您是否需要 alfa | onebeta | two 的值,因此它会抛出错误。

为什么 'strict' => false 解决了这个问题?

当您将 strict 设置为 false 时,sql 将自动选择一个默认规则来选取连接的列值,而不是抛出错误。

没有'strict' => false如何解决问题?

使用 MINMAX(或任何其他规则)。
我不知道你加入的 table 有哪些列,所以这是我的代码的简化版本:

$data = Payment::
    leftJoin('videos', 'videos.id', '=', 'payments.video_id')
    ->selectRaw('
            // payment columns
            min(videos.stream_start) stream_start,
            min(videos.keep_archive) keep_archive
        ')
    ->whereIn('payments.video_id', $videos)
    ->groupBy('year', 'month')
    ->orderBy('year', 'desc')
    ->get();

如您所见,我只从连接的 table 中选择两列,所以我只需要在这两列上写 min(column),即使 'strict' => true 错误也会消失(我不确定您是否还需要第一个 table 的规则)。