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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:06