Laravel中如何统计各课程对应的排课数量?
解决方案
方法一:集合分组(适合小型数据集)
在控制器中对排课数据做分组统计,避免在视图里处理重复逻辑:
// 预加载关联,避免N+1查询问题 $singledegreesection->load(['classschedule.ccourse.course']); // 按课程名称分组,统计每组的排课数量 $courseStats = $singledegreesection->classschedule->groupBy(function ($schedule) { return $schedule->ccourse->course->course_title; })->map(fn($group) => $group->count());
把$courseStats传到视图后,直接遍历输出:
@foreach ($courseStats as $title => $count) {{ $title }} - {{ $count }} <br> @endforeach
方法二:数据库层面分组(适合大型数据集,性能更优)
直接通过数据库查询完成分组统计,减少内存消耗:
$courseStats = $singledegreesection->classschedule() ->join('ccourses', 'class_schedules.ccourse_id', '=', 'ccourses.id') ->join('courses', 'ccourses.course_id', '=', 'courses.id') ->selectRaw('courses.course_title, COUNT(class_schedules.id) as total') ->groupBy('courses.course_title') ->get() ->pluck('total', 'course_title');
视图层的输出代码和方法一完全一致。
注意事项
视图的核心职责是展示数据,复杂的统计逻辑放在控制器或模型层更符合MVC架构;数据库层面的分组查询比集合分组性能更优,数据量大时差异会更明显。
内容的提问来源于stack exchange,提问作者Mohan Palanisamy
相关产品推荐
相关产品推荐

