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
相关产品推荐
相关产品推荐

