我正在建立的应用程序允许教师评估他们的学生。他们可以在任意数量的班级中拥有任意数量的学生。 (例如,A老师可能只教一门25名学生,但老师B可以教授4门30名学生7门不同科目。)我的最终目标是为教师绘制任何选定班级的表现数据。这就是图表的样子:
我有一个包含一系列数据的MySQL表。它的结构如下所示:
id user_id room_id student_id subject_id unit_id outcome_id assessed_level 200 28 50 69 23 203 849 4 201 28 50 66 23 203 849 3 202 28 50 76 23 203 849 2 203 28 50 69 23 212 849 4 204 28 50 66 23 212 849 1 205 28 50 76 23 212 849 3 etc.
在一个视图中,我想抓住每个科目的所有学生,并确定1-4作为他们的分数的平均值达到了多少。他们可能已经在一个主题中被评估了很多次,我需要输出所选课堂上教授的所有科目的数据,所以我确定我需要在整个循环中运行它。
我使用以下来获取数据:
for($x=0; $x<count($students_of_room); $x++) {
$assessment_data[] = DB::table('student_assessments')
->join('subjects', 'student_assessments.subject_id', '=', 'subjects.id')
->select('student_assessments.student_id as student_id', 'subjects.name as subject_name', DB::raw('round(avg(student_assessments.assessed_level)) AS average'))
->where('student_assessments.user_id', Auth::id())
->where('student_assessments.room_id', $selected_room->id)
->where('student_assessments.student_id', $students_of_room[$x]->id)
->groupBy('student_assessments.subject_id')
->get();
}
产生这些结果:
[{“student_id”:69,“subject_name”:“科学”,“平均”:“4”}] [{“student_id”:66,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:76,“subject_name”:“科学”,“平均”:“2”}] [{“student_id”:67,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:64,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:68,“subject_name”:“科学”,“平均”:“2”}] [{“student_id”:75,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:73,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:74,“subject_name”:“科学”,“平均”:“2”}] [{“student_id”:70,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:65,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:62,“subject_name”:“科学”,“平均”:“2”}] [{“student_id”:63,“subject_name”:“科学”,“平均”:“3”}] [{“student_id”:71,“subject_name”:“科学”,“平均”:“3”}] [{ “student_id数据”:72, “SUBJECT_NAME”: “科学”, “平均”: “1”}]
我希望能够将这些结果组合在一起,以便所有平均为4的学生在一起,3s在一起,2s和1s。
从上面的示例输出中,我将有4名学生,3名学生,3名学生,2名学生,1名学生。
我希望它看起来像这样:
[{“subject_name”:“科学”,“级别”:“4”,“num_students”:“1”}] [{“subject_name”:“科学”,“级别”:“3”,“num_students”:“ 9“}] [{”subject_name“:”科学“,”等级“:”2“,”num_students“:”4“}] [{”subject_name“:”科学“,”等级“:”1“,” num_students “:” 1" }]
我怎么能得到这个结果?
此外,如果还有其他问题我的代码可以改进,我也对此持开放态度。谢谢!
我认为以下查询会给你第一个结果,请试一试。
DB::table('student_assessments')
->join('subjects', 'student_assessments.subject_id', '=', 'subjects.id')
->where('student_assessments.user_id', Auth::id())
->where('student_assessments.room_id', $selected_room->id)
->select('student_assessments.id','subject.name as subject_name','subject.id as subject_id',DB::raw('round(avg(student_assessments.assessed_level)) AS average'))
->groupBy('subject_id','id')
->get();