我用逗号分隔值将学生的课程缺席存储在数据库中。
我确实把逗号作为正则表达式来计算学生缺课的数量。
我就是这样做的。
@foreach($students as $student)
{{(preg_match_all('/[^,]+/',DB::table('discontinuities')
->where('student_id', $student->id)
->where('type2','absent')->pluck('type2Lesson'))) }}
Lessons student was absent.
@endforeach
但问题是学生可能缺席多天,这意味着多行存储在不连续表中,此查询显示返回的唯一第一个值。但我需要总计总价值来回报学生缺课的数量
这是学生缺课的例子
这是结果查询
修改:
如果我先输入2个缺席然后再缺席1个
然后结果是
答案 0 :(得分:1)
@foreach($students as $student)
<?php $absences = DB::table('discontinuities')
->select('type2Lesson')
->where('student_id', $student->id)
->where('type2','absent'))
->get();
$count = 0;
foreach($absences as $absence){
$count += count(explode(',', $absence->type2Lesson));
}
?>
{{$count}} lessons student was absent.
@endforeach
这应该有效。将数据以json或CSV格式保存在数据库中并不是一种好的做法,因为最终无法编写查询来执行您想要的操作。例如,最好有一个学生应该参加的每个班级的数据库,以及缺席与否的布尔值。那么你可以算一下缺席。
答案 1 :(得分:0)
您需要执行一个查询,将给定学生的缺勤记录组合在一起。我甚至会让查询计算缺勤天数。它可以统计逗号,然后对该值执行标准->sum()
:
@foreach($students as $student)
{{
DB::table('discontinuities')
->where('student_id', $student->id)
->where('type2','absent')
->sum(DB::raw("LENGTH(type2Lesson) - LENGTH(REPLACE(type2Lesson, ',', ''))+1")
}}
Lessons student was absent.
@endforeach
查询需要 DB :: raw()调用来计算逗号数。该表达式的语法依赖于数据库引擎。以上适用于MySql,但对于其他数据库,您需要使用LEN
而不是LENGTH
。