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

Laravel中从数据库获取ID:能否无需foreach简化这段代码?

Laravel中简化ID数组查询Quest模型的方法

当然可以简化,而且必须简化——你原来的代码会发起多次数据库请求(数组有多少个元素就发多少次),不仅冗余还影响性能。用Laravel的whereIn方法就能一步搞定,下面分两种场景给方案:

场景1:不需要保留原数组的重复项和顺序

如果只需要获取所有对应ID的Quest实例(去重后的),直接用whereIn+get():

$userQuestIds = [2,4,45,586,16,2,143,234,654,78,56];
// 先去重避免无效查询
$uniqueIds = array_unique($userQuestIds);
// 一次查询获取所有符合条件的模型
$typeQuests = Quest::whereIn('id', $uniqueIds)->get();

这会生成一条包含IN条件的SQL语句,只和数据库交互一次,效率比循环高得多,返回的是Laravel的Collection集合,方便后续操作。

场景2:需要保留原数组的顺序和重复项

如果要和原数组的元素顺序、重复项完全对应(比如原数组里有两个ID=2,就要返回两个Quest实例),可以先批量查询再映射:

$userQuestIds = [2,4,45,586,16,2,143,234,654,78,56];
$uniqueIds = array_unique($userQuestIds);

// 批量查询并按ID建立映射,方便快速查找
$questMap = Quest::whereIn('id', $uniqueIds)->get()->keyBy('id');

// 遍历原数组,从映射中取出对应模型
$typeQuests = array_map(function($id) use ($questMap) {
    return $questMap->get($id);
}, $userQuestIds);

这种方式同样只发起一次数据库请求,同时完美保留原数组的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:35:30