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

Laravel中whereIn查询未返回全部结果的问题求助

问题分析与解决

核心问题

  1. 数据类型不匹配
    你通过explode得到的是字符串数组["97","17"],而数据库中responders字段存储的内容会被MySQL隐式转换为数字处理。当使用数字数组[97,17]时,MySQL会自动将字符串类型的字段值转为数字匹配,能命中那些responders字段值为单个数字(如"97")的记录;但用字符串数组时,是精确匹配字段值等于"97"或"17"的记录,包含多个ID的条目(如"97,17")无法被匹配。

  2. whereIn逻辑不符合需求
    你实际需要的是找出responders字段包含任意目标用户ID的记录,但whereIn('responders', $array)的逻辑是匹配字段值完全等于数组中某一项的记录,两者逻辑完全不符。

正确查询写法

利用MySQL的FIND_IN_SET函数实现“字段包含指定值”的逻辑,结合Laravel查询构造器:

$incident_responders = explode(',', $incident->incident_uid);

$schemevehicles = SchemeVehicleLog::whereDate('signout_date', '<=', $incident->incident_date)
    ->where(function ($q) use ($incident) {
        $q->where('return_date', '>=', $incident->incident_date)
          ->orWhere('return_date', null);
    })
    ->where(function ($q) use ($incident_responders) {
        foreach ($incident_responders as $uid) {
            $q->orWhereRaw('FIND_IN_SET(?, responders)', [$uid]);
        }
    })
    ->get();

额外建议

逗号分隔存储多ID的设计违反数据库范式,长期会导致查询性能低下、维护困难。建议创建中间表(如scheme_vehicle_log_responders),用多对多关联的方式存储车辆日志与用户的关联关系,让数据结构更规范、查询更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:05:21