Laravel 连表查询报语法错误,拿 sql 到数据库执行正常

laravel连表查询报语法错误,拿sql到数据库执行正常,下面上代码

        $model = new Curriculum;
        $data['data'] = $model->setTable('c')
            ->from('curriculums as c')
            ->select(DB::raw('c.*,GROUP_CONCAT(cp.position_id) AS position_ids'))
            ->where('c.c_id',$user_info['c_id'])
            ->where('c.is_del',0)
            ->leftJoin('curriculum_position as cp', 'c.id', '=', 'cp.curriculum_id')
//            ->when($keyword, function ($query) use ($keyword) {
//                return $query->where('c.name','like','%'.$keyword.'%');
//            })
            ->groupBy('c.id')
            ->orderBy('c.created_at','DESC')
            ->skip($skip)->take($limit)->get()->toArray();

laravel连表查询报语法错误,拿sql到数据库执行正常

报错信息:Illuminate\Database\QueryException: SQLSTATE[42000]: Syntax error or access violation: 1055 'zkw_teach.c.c_id' isn't in GROUP BY (SQL: select c.*,GROUP_CONCAT(cp.position_id) AS position_ids from curriculums as c left join curriculum_position as cp on c.id = cp.curriculum_id where c.c_id = 12 and c.is_del = 0 group by c.id order by c.created_at desc limit 10 offset 0)

复制此条sql到navicat中执行成功

laravel连表查询报语法错误,拿sql到数据库执行正常

转变思路,使用原生sql写,结果依旧是报错,代码如下

        $sql_pre = "SELECT c.*,GROUP_CONCAT(cp.position_id) as position_ids 
                    FROM curriculums AS c 
                    LEFT JOIN curriculum_position AS cp ON c.id = cp.curriculum_id
                    WHERE c.c_id = 12 AND c.is_del = 0 ";

//        if ($keyword){
//            $sql_pre .= " AND c.name LIKE \'%$keyword%\' ";
//        }

        $sql_suf = "GROUP BY c.id ORDER BY c.created_at DESC LIMIT $limit OFFSET $skip";

        $sql = $sql_pre.$sql_suf;
        $res = DB::select($sql);

报错信息依旧:Illuminate\Database\QueryException: SQLSTATE[42000]: Syntax error or access violation: 1055 'zkw_teach.c.c_id' isn't in GROUP BY (SQL: SELECT c.*,GROUP_CONCAT(cp.position_id) as position_ids FROM curriculums AS c
LEFT JOIN curriculum_position AS cp ON c.id = cp.curriculum_id
WHERE c.c_id = 12 AND c.is_del = 0 GROUP BY c.id ORDER BY c.created_at DESC LIMIT 10 OFFSET 0)

拿sql到navicat中执行也是正常的

php
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

config 目录下的 database文件里,把数据库配置 strict 的值设为 false即可。

4年前 评论
private_wa (楼主) 4年前
讨论数量: 3

我能说,我已经有10几年没有写过两表以上的关联查询吗

4年前 评论
L学习不停 4年前
dongjw321 (作者) 4年前

config 目录下的 database文件里,把数据库配置 strict 的值设为 false即可。

4年前 评论
private_wa (楼主) 4年前

strict 即为严格模式 开启之后将会对 mysql 的 sql_mode 进行设置

file

关于sql_mode 的更多了解可以参考下面这个文章就能解答你的疑惑了 https://www.cnblogs.com/fireporsche/p/8618...

4年前 评论
private_wa (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!