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
相关产品推荐
相关产品推荐

