Laravel中whereIn查询未返回全部结果的问题求助
问题分析与解决
核心问题
数据类型不匹配
你通过explode得到的是字符串数组["97","17"],而数据库中responders字段存储的内容会被MySQL隐式转换为数字处理。当使用数字数组[97,17]时,MySQL会自动将字符串类型的字段值转为数字匹配,能命中那些responders字段值为单个数字(如"97")的记录;但用字符串数组时,是精确匹配字段值等于"97"或"17"的记录,包含多个ID的条目(如"97,17")无法被匹配。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
相关产品推荐
相关产品推荐

