6

这可能很明显,我可能完全忽略了这一点,但我有一个包含多行 user_id、site_id 的表,例如

ldstaff | ld_site
____________________
   3         1
   3         2
   4         1 

最初由一位老开发人员编写的 MySQL 查询让员工 id 找到他们的名字,然后将所有站点连接在一起以制作类似的东西。

StaffID | Name | sites
  3       Dave    1,2

此查询最初编写为

SELECT `ld_staff` as staffID ,a.name,GROUP_CONCAT(`ld_site`) as sites FROM `lead_distribution` l

LEFT JOIN users a ON a.crm_id = l.ld_staff

WHERE ld_enabled = 1 AND

`account_type` = 1 AND `active` = 1 AND `no_more` = 0 AND network_team > 0 AND renewal_team = 0

GROUP BY `ld_staff`

但是,每当我们尝试在 Laravel 中将其作为新系统的一部分编写以获得相同的结果时,我们都会遇到错误SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2无论我们如何尝试篡改查询总是回到这个。读起来似乎 sql_mode only_full_group_by 不允许这种类型的查询,所以我将 sql_mode 更改为 = " " 并且此错误仍然存​​在。

询问

$data = DB::table('lead_distribution')
    ->join('users', 'ld_staff', '=', 'users.crm_id')
    ->select("lead_distribution.ld_staff", 'users.name', 
        DB::raw("GROUP_CONCAT(`ld_site`) as sites"))
    ->where('users.account_type', '=', 1)
    ->where('users.active', '=', 1)
    ->where('users.no_more', '=', 0)
    ->where('users.network_team', '>', 0)
    ->where('users.renewal_team', '=', 0)
    ->groupBy('lead_distribution.ld_staff')
    ->get();
4

3 回答 3

9

@jaysingkar

答案修复了它,我错过了它的愚蠢错误。

config/database.php

更改 'strict' => true'strict' => false

于 2016-09-23T10:28:12.073 回答
3

配置/数据库.php

将 'strict' => true 更改为 'strict' => false
并清除缓存
php artisan config:cache
然后问题将得到解决。

于 2017-07-06T15:56:09.763 回答
1

我遇到了这个问题,并通过在GROUP BY子句中包含聚合函数来解决它。

我忘了我在哪里读过这个,但是聚合函数必须包含在指定的sql_mode only_full_group_by模式中。

所以,尝试使用 ->groupBy(['lead_distribution.ld_staff','sites'])->groupBy(['lead_distribution.ld_staff','users.name','sites'])

一个方便的提示

尝试通过替换来转储 laravel 生成的 SQL 查询->get()->toSql()然后尝试运行 laravel 生成的查询并查看是否出现错误。

于 2016-09-23T10:25:21.563 回答