Laravel查询时需对值执行explode后添加where条件的实现问题
错误原因分析
你原有代码存在3个核心问题:
whereIn参数顺序错误,第一个参数应为字段名,第二个参数为匹配值数组- 你直接对字符串
'preference->appoint_info->location_dropdown'执行explode,拆分的是你写死的字符串本身,而非数据库存储的对应字段值 - 未正确处理JSON字段的取值逻辑,直接写字段路径无法被SQL自动解析为JSON内部属性
正确实现方案
根据你的实际需求选择对应方案:
方案1:输入值拆分后匹配字段
如果你的需求是:将输入的空格分隔字符串拆分,筛选字段值等于拆分后任意一个元素的记录,直接调整whereIn参数顺序即可:
// 拆分输入的目标字符串为数组 $targetArr = explode(' ', 'ssss'); // 传入字段名和匹配数组 dd($appointments->whereIn('preference->appoint_info->location_dropdown', $targetArr)->get());
方案2:数据库字段值拆分后匹配目标值
如果你的需求是:将数据库中存储的preference->appoint_info->location_dropdown字段的空格分隔值拆分,筛选拆分后数组包含目标值的记录,使用whereRaw配合SQL函数实现(适用于MySQL 5.7+):
$target = 'ssss'; dd($appointments->whereRaw( "FIND_IN_SET(?, REPLACE(JSON_UNQUOTE(JSON_EXTRACT(preference, '$.appoint_info.location_dropdown')), ' ', ',')) > 0", [$target] )->get());
逻辑说明:先提取JSON字段对应路径的值,把空格替换为逗号,再用FIND_IN_SET判断目标值是否存在,可避免模糊匹配的误判问题。
方案3:集合层面过滤
如果$appointments已经是查询返回的集合实例,直接用集合的filter方法处理即可:
$target = 'ssss'; $result = $appointments->filter(function ($item) use ($target) { $locationArr = explode(' ', $item->preference['appoint_info']['location_dropdown'] ?? ''); return in_array($target, $locationArr); }); dd($result);
内容的提问来源于stack exchange,提问作者Ilhamzac
相关产品推荐
相关产品推荐

