You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:25:38