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

Laravel中如何匹配数组获取users表中符合条件的记录?

问题原因

你当前使用的 whereJsonContains('preferences', Arr::flatten(json_decode($arr))) 逻辑是要求 preferences 字段完全包含传入的整个数组元素(即同时存在"a"和"b"),所以仅匹配到id=2的记录。而你需要的是匹配preferences包含["a","b"]中任意一个元素的记录。

另外,你的代码里json_decode($arr)是多余的——因为$arr本身就是PHP数组,json_decode仅用于解析JSON字符串,这一步会导致错误(传入非字符串会返回null),Arr::flatten也无意义,因为原数组已经是一维的。

解决方案

要获取包含"a"或"b"的所有记录,你可以通过以下两种方式实现:

方式一:循环添加OR匹配条件

通过orWhereJsonContains为数组中的每个元素单独添加匹配条件:

$arr = ["a", "b"];

// 初始化查询构造器
$query = User::select('id', 'preferences');

// 为数组中的每个元素添加OR条件
foreach ($arr as $value) {
    $query->orWhereJsonContains('preferences', $value);
}

// 执行查询
$posts = $query->get();

这段代码会生成类似以下的SQL语句(以MySQL为例):

SELECT `id`, `preferences` FROM `users` 
WHERE JSON_CONTAINS(`preferences`, '"a"') OR JSON_CONTAINS(`preferences`, '"b"')

最终会匹配到id为2、3、4、5的所有目标记录。

方式二:利用Laravel新版本的参数特性(Laravel 8.77+)

如果你使用的是Laravel 8.77及以上版本,可以直接给whereJsonContains传入第三个参数'or',实现“任意元素匹配”:

$arr = ["a", "b"];

$posts = User::select('id','preferences')
    ->whereJsonContains('preferences', $arr, 'or')
    ->get();

第三个参数'or'表示只要JSON数组包含传入数组中的任意一个元素即可匹配,无需全部包含。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:55:46