正则表达式为学生缺课

时间:2016-02-10 18:58:46

标签: php regex laravel

我用逗号分隔值将学生的课程缺席存储在数据库中。

我确实把逗号作为正则表达式来计算学生缺课的数量。

我就是这样做的。

@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

但问题是学生可能缺席多天,这意味着多行存储在不连续表中,此查询显示返回的唯一第一个值。但我需要总计总价值来回报学生缺课的数量

这是学生缺课的例子

enter image description here

这是结果查询

enter image description here

修改:

如果我先输入2个缺席然后再缺席1个

enter image description here

然后结果是

enter image description here

2 个答案:

答案 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