文章目录 [+]
前言
最近因为大佬走了,然后所有的项目都是我直接负责,然后呢,今天出了这么一档子事,线下和线上数据库一致,且代码也一直,然而在查询时使用了groupBy,导致线上一直报错,报错图如下:
SQLSTATE[42000]: Syntax error or access violation: 1055 'offline_course.course.id' isn't in GROUP BY (SQL: select `course`.`id`, `course`.`title`, CONCAT(\"http://image.article.canka168.com/\", course.cover) as list_cover, `teacher`, `begin_time` from `order` left join `course` on `order`.`course_id` = `course`.`id` where (`order`.`user_id` = 10000 and `begin_time` > 2019-03-12 16:01:35) and `order`.`order_status` in (0, 1) group by `order`.`course_id` order by `begin_time` desc)
源代码如下:
Order::leftJoin('course','order.course_id', '=','course.id') ->select([ 'course.id', 'course.title' , DB::raw ( 'CONCAT("http://***.com",course.cover) as list_cover' ) , 'teacher', 'begin_time' ]) ->where ( [ ['order.user_id','=',10000] ,['begin_time' , '>' , date ('Y-m-d H:i:s',time())]] ) ->whereIn ( 'order.order_status' , [ 0,1 ] ) ->orderBy('begin_time','desc') ->groupBy('order.course_id') ->get ();
很是费解,且无法打印sql语句,多方调试之后,才知道问题也算是出在sql查询上,也不算是,具体分析如下:
其实就是sql_mode设置导致的问题,我们修改config/database.php这个配置strict => false,
'***' => [ 'driver' => 'mysql', 'host' => env ('DB_HOST', '127.0.0.1'), 'port' => env ('DB_PORT', '3306'), 'database' => 'offline_course', 'username' => env ('DB_USERNAME', 'forge'), 'password' => env ('DB_PASSWORD', ''), 'unix_socket' => env ('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ],
然后你就可以去测试了,会发现问题不再出现,然后具体原因如下:
查询mysql 1055错误码发现问题为在mysql的配置中如果设置了sql_mode包含
ONLY_FULL_GROUP_BY值得话,在进行查询时需要将select的字段都包含在group by 中。
即 select x,y from xxx group by x,y
否则就会报错
总结:
laravel 5.6 是默认开启 mysql严格模式的. mysql在严格模式下, 并且开启了ONLY_FULL_GROUP_BY的情况下, group by 的字段没有出现在 select 的语句中会报错.关闭了严格模式就不会报错。其实只要我们多去学习就会发现问题很好解决。
发表评论