Laravel 8 QueryBuilder左连接JSON_CONTAINS时多余=``的去除方法
解决Laravel 8 QueryBuilder左连接自动生成多余`= ```的问题
你的原生SQL逻辑是对的,但转成QueryBuilder时因为leftJoin的参数使用错误,导致框架自动拼接了多余的`= ```。
问题原因
你调用leftJoin时传递了三个参数,Laravel会默认将其解析为leftJoin(表名, 匹配列, 匹配值)的格式,自动生成ON 匹配列 = 匹配值的条件。你传入的后两个空DB::raw()被框架当作匹配列和匹配值,于是就出现了`JSON_CONTAINS(...) = ```这种错误拼接。
正确实现方式
有两种方法可以生成正确的SQL:
方法一:用闭包定义ON条件
通过闭包传入$join对象,直接用on()方法传入自定义的SQL表达式:
DB::table('meeting') ->selectRaw('meeting.id, GROUP_CONCAT(users.name separator " | ") AS present_user_id') ->leftJoin('users', function ($join) { $join->on(DB::raw("JSON_CONTAINS(meeting.present_user_id, JSON_ARRAY(users.id), '$')")); }) ->groupBy('meeting.id') ->get();
方法二:使用leftJoinRaw直接写入完整连接语句
如果连接条件是固定的,直接用leftJoinRaw写入包含ON子句的完整连接表达式:
DB::table('meeting') ->selectRaw('meeting.id, GROUP_CONCAT(users.name separator " | ") AS present_user_id') ->leftJoinRaw('users ON JSON_CONTAINS(meeting.present_user_id, JSON_ARRAY(users.id), \'$\')') ->groupBy('meeting.id') ->get();
两种方式都能正确生成你需要的原生SQL,不会出现多余的= ```。闭包方式适合需要动态调整连接条件的场景,leftJoinRaw`则更适合固定的连接逻辑。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

