Laravel使用whereIn查询结果未按传入id数组顺序返回如何处理
问题原因
数据库执行whereIn查询时,默认会按照表的默认排序规则(通常是主键升序)返回结果,不会自动匹配你传入的ID数组的顺序,需要手动指定排序规则。
注意:执行查询前请先判断
$carIds不为空,避免空数组传入导致SQL语法错误。
解决方案
方案1:查询阶段指定排序(推荐,性能更高)
利用数据库原生函数自定义排序规则,查询时直接返回符合顺序的结果:
- MySQL 环境写法:
$carIds = [21,12,33]; $cars = Cars::whereIn('id', $carIds) // 参数绑定写法,规避SQL注入风险 ->orderByRaw('FIELD(id, ?)', [$carIds]) ->get();
- PostgreSQL 环境写法:
$carIds = [21,12,33]; $cars = Cars::whereIn('id', $carIds) ->orderByRaw('array_position(ARRAY[' . implode(',', $carIds) . '], id)') ->get();
方案2:查询后通过集合排序
如果不想编写原生SQL,可以拿到查询结果后通过Laravel集合方法手动排序:
$carIds = [21,12,33]; $cars = Cars::whereIn('id', $carIds) ->get() ->sortBy(fn($car) => array_search($car->id, $carIds)) ->values(); // 重置集合的键为连续的数字索引,可选
内容的提问来源于stack exchange,提问作者Shakira
相关产品推荐
相关产品推荐

