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

Laravel Eloquent中嵌套JOIN使用IN条件的正确实现方法

解决Laravel Eloquent中JOIN关联带IN条件的查询问题

你遇到的问题其实是Laravel查询构建器的on()方法使用限制导致的——它默认只处理简单的等式匹配,直接把'in'作为操作符传进去并不会生成正确的IN语法,反而会被当成字符串值处理,所以才出现了= IN的错误SQL片段。

下面给你两种正确的实现方式:

方法一:使用whereIn()(推荐)

在JOIN的闭包回调里,直接用whereIn()来添加IN条件,它会自动帮你生成正确的SQL约束:

$query->leftJoin('product_variable_values as val_alias', function ($join) use($rule) {
    $join->on('products.id', '=', 'val_alias.product_id')
         ->whereIn('val_alias.product_variable_option_id', [1, 2, 3]);
});

这种方式是Laravel推荐的写法,不仅语法清晰,还能自动处理SQL注入防护,生成的正确SQL会是:

left join `product_variable_values` as `val_alias` on `products`.`id` = `val_alias`.`product_id` and `val_alias`.`product_variable_option_id` in (1, 2, 3)

方法二:使用whereRaw()(灵活场景)

如果你的IN条件需要更复杂的原生SQL逻辑,可以用whereRaw()来手动指定:

$query->leftJoin('product_variable_values as val_alias', function ($join) use($rule) {
    $join->on('products.id', '=', 'val_alias.product_id')
         ->whereRaw('val_alias.product_variable_option_id in (?)', [implode(',', [1, 2, 3])]);
});

注意这里要通过参数绑定来避免SQL注入,不要直接把数组拼接到字符串里。

简单总结一下:Laravel的JOIN闭包里支持调用所有的where系列方法,所以遇到IN、LIKE这类非等式的关联约束时,直接用对应的where方法就可以了,不用硬塞进on()里~

内容的提问来源于stack exchange,提问作者karatecode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:52:34