Laravel Eloquent如何按重复ID数组获取多条重复记录?
解决Laravel中whereIn返回重复ID对应多条记录的问题
数据库的WHERE IN语法本身会自动去重,所以不管你的ID数组里重复多少次,只会返回每个ID对应的唯一记录。下面提供两种不用手动循环的解决方案:
方案一:通过UNION ALL在数据库层面返回重复记录
利用UNION ALL不会合并重复结果的特性,为每个ID生成单独的查询语句并拼接:
$articleIds = [5, 5, 5]; // 构造UNION ALL查询语句 $subQueries = collect($articleIds)->map(function ($id) { return DB::raw("SELECT * FROM articles WHERE id = ?", [$id]); })->implode(' UNION ALL '); // 执行查询并转换为Eloquent模型实例 $articles = Article::hydrate(DB::select($subQueries));
这种方式会让数据库返回与原ID数组长度一致的记录,每个重复ID对应一条结果。
方案二:集合映射(仅一次数据库查询,性能更优)
先查询所有唯一ID的记录,再通过集合映射生成包含重复项的结果:
$articleIds = [5, 5, 5]; // 获取所有唯一ID的文章,按ID分组 $articleMap = Article::whereIn('id', array_unique($articleIds))->get()->keyBy('id'); // 根据原ID数组映射出重复的记录集合 $articles = collect($articleIds)->map(fn($id) => $articleMap[$id]);
这个方法只需要一次数据库查询,后续在内存中通过集合处理重复项,性能比方案一更高效,同时也符合你不想用循环的需求。
内容的提问来源于stack exchange,提问作者always-a-learner
相关产品推荐
相关产品推荐

