Laravel数组ID批量查询数据库并按ID返回对应结果问题
问题分析
你当前的代码是逐个统计每个学校符合条件的记录数,所以最终得到的是各学校数量组成的数组[3,1],而你预期的4应该是这两个数值的总和。其实完全没必要循环逐个查询,不仅效率低,还容易出现冗余输出,我们可以优化写法来达到需求。
解决方案
方案1:直接获取总记录数(推荐)
如果你的核心需求就是拿到所有学校符合条件的总数量,推荐用一次数据库查询搞定,效率更高:
$schools = collect($api->schools); $schoolIds = $schools->pluck('id')->toArray(); // 提取所有学校ID为数组 // 一次查询获取总数量 $totalCount = DB::table('sys_record') ->join('sys_users', 'sys_users.id_jovens', '=', 'sys_record.id_user') ->where('sys_record.id_step', '<=', 4) ->whereIn('sys_users.schoolId', $schoolIds) // 用whereIn匹配所有目标学校ID ->count(); echo $totalCount; // 输出4
方案2:保留各学校数量同时计算总和
如果你既需要保留每个学校的记录数数组,又要得到总和,可以在现有代码基础上补充求和步骤:
$schools = collect($api->schools); $info = $schools->pluck('id'); $information = []; for($i = 0;$i<count($info);$i++){ $select = DB::table('sys_record') ->where('sys_record.id_step','<=',4) ->where('sys_users.schoolId','=',$info[$i]) ->join('sys_users', 'sys_users.id_jovens', '=', 'sys_record.id_user') ->get(); $information[] = count($select); } // 计算数组元素总和 $total = array_sum($information); echo $total; // 输出4 // 也可以查看各学校的数量数组 print_r($information); // 输出Array ( [0] => 3 [1] => 1 )
补充说明
你原代码里把print_r($information)放在了循环内部,所以每次循环都会输出一次当前的数组状态,这就是你看到两次输出的原因。把它移到循环外面,就能看到完整的最终数组了。
内容的提问来源于stack exchange,提问作者testCode
相关产品推荐
相关产品推荐

