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

Laravel Eloquent如何用数组查询JSON类型列(替代whereIn)

解决Laravel中JSON数组列的查询问题

场景1:查询JSON数组列与传入数组有任意交集(即包含数组中至少一个元素)

如果你的MySQL版本是8.0.17及以上,推荐用JSON_OVERLAPS函数——它专门用来判断两个JSON数组是否存在共同元素,写法简洁又高效:

$users = ['Tom', 'Bill'];
// 把数组转成合法JSON字符串,通过参数绑定避免SQL注入
$query->whereRaw('JSON_OVERLAPS(user, ?)', [json_encode($users)]);

这段代码最终生成的SQL是:

SELECT * FROM your_table WHERE JSON_OVERLAPS(user, '["Tom","Bill"]')

刚好匹配你存储的["Paul", "Tom", "Bob"]这类数据,只要目标数组和传入数组有重叠元素就会被筛选出来。

场景2:查询JSON数组列包含传入数组的所有元素

如果需要确保目标JSON数组同时包含传入数组的每一个元素,可以循环添加JSON_CONTAINS条件:

$users = ['Tom', 'Bob'];

$query->where(function ($subQuery) use ($users) {
    foreach ($users as $user) {
        // 每个元素单独转成JSON字符串,作为JSON_CONTAINS的候选值
        $subQuery->whereRaw('JSON_CONTAINS(user, ?)', [json_encode($user)]);
    }
});

对应的SQL会是:

SELECT * FROM your_table 
WHERE JSON_CONTAINS(user, '"Tom"') AND JSON_CONTAINS(user, '"Bob"')

只有当user列的JSON数组同时包含Tom和Bob时才会返回结果。

你之前的写法为什么失败?

  1. 数组转字符串问题:直接在SQL字符串里插入$users数组,PHP会自动把数组转成字符串"Array",导致SQL语法完全错误;
  2. JSON格式错误:你手动写的'"tom","Bill"'并不是合法的JSON,正确的JSON数组必须用方括号包裹:'["tom","Bill"]';
  3. SQL注入风险:直接拼接变量到SQL语句里会带来安全隐患,始终推荐用参数绑定的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:50:42