一个菜鸟驿站!

Laravel : Syntax error or access violation: 1055 Error

PHP 2019-03-12 浏览(1959) 评论(0)
- N +

文章目录 [+]

前言

最近因为大佬走了,然后所有的项目都是我直接负责,然后呢,今天出了这么一档子事,线下和线上数据库一致,且代码也一直,然而在查询时使用了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 的语句中会报错.关闭了严格模式就不会报错。其实只要我们多去学习就会发现问题很好解决。

标签:
作者:猫巷

,

评论列表 (0)条评论

发表评论

召唤伊斯特瓦尔