16.Laravel报错SQLSTATE[42000] Syntax error or access violation 1055 'xxx' isn't in GROUP BY.txt

2016.11.15


1.问题描述


今天做项目优化时做了个视图来优化查询,创建视图语句为
select `edm_courses`.`cou_id` AS `cou_id`,
`edm_courses`.`cou_name` AS `cou_name`,
`edm_courses`.`tch_id` AS `tch_id`,
`edm_teachers`.`tch_name` AS `tch_name`,
`edm_courses`.`cou_qrcode` AS `cou_qrcode`,
`edm_courses`.`start_time` AS `start_time`,
`edm_courses`.`stop_time` AS `stop_time`,
count(`edm_calls`.`call_id`) AS `call_num` 
from ((`edm_courses` left join `edm_calls` on((`edm_courses`.`cou_id` =

`edm_calls`.`cou_id`))) 
left join `edm_teachers` on((`edm_courses`.`tch_id` =

`edm_teachers`.`tch_id`))) 
group by `edm_courses`.`cou_id`。
然后在Laravel中创建了模型Course,然后进行查询
Course::where('tch_id',8)->get();
结果报错:
 SQLSTATE[42000]: Syntax error or access violation: 1055 'edm_courses.cou_name' isn't in GROUP BY


2.解决过程


查询mysql 1055错误码发现问题为在mysql的配置中如果设置了sql_mode包含

ONLY_FULL_GROUP_BY值得话,在进行查询时需要将select的字段都包含在group by 中。
即 select x,y from xxx group by x,y
否则就会报错

参考链接: http://stackoverflow.com/questions/25800411/mysql-isnt-in-group-by




但是查看自己的配置my.cnf发现在sql_mode中并没有ONLY_FULL_GROUP_BY这个值,然后在终端和navicat中使用运行sql语句
select * from view where tch_id = 8;
发现并没有报错,可以正确输出结果,由此猜想并不是数据库配置的原因,应该是laravel框架的原因


然后去查看Laravel的配置文件,config/database.php,查找mysql的配置,
'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => env('DB_PREFIX',''),
            'strict' => true,
            'engine' => null,
        ],
发现有个strict项,默认为true,上网也没有查找到相关解释,根据字面意思猜测可能为是否开启严格模式,将其修改为false,再次测试发现问题解决,可以输出正确结果

3.总结


在mysql的配置中,sql_mode的ONLY_FULL_GROUP_BY值代表group by字句中的字段必须全部包括select中的字段,

Laravel中也有相对应的配置项,在使用laravel时应该注意。

暂时还不知道strict配置项的具体意义,有待查证

你可能感兴趣的:(学习笔记)