雄辩的,如何获得新字段中计算出的字段总和

时间:2019-02-17 21:09:35

标签: php laravel eloquent dynamicquery

我有一个数据库表students,其中包含每个科目的所有科目的最终成绩,这是一个相当大的数字,还有许多其他字段,例如名称等。

students(表格有100列以上,每个单元格可以具有一些预设ID,后来将其转换为等级/一些愚蠢的反黑客技术,其中多个数字可以代表相同的等级/ )

|| name  || surname|| section || math1||math 2||math 16|| physics 1||physics 2 ||... ||
|| Jonah || Smith  ||  A4     || 17   || 19   || 0     || 193      ||          ||    
|| John  ||Doe     ||  A3     ||  0   || 0    || 34    ||12        ||  0       || ...||
|| Jane  ||Doe     ||  A3     ||  0   || 0    || 48    ||12        ||  154     || ...||
|| Martin||Doe     ||  A3     || 17   || 34   || 96    ||10        || 225      || ...||

理想结果

|| avg.grade || name  || surname|| section || math1||math 2||math 16|| physics 1||physics 2||... ||
|| 0.92      || John  ||Doe     || A3      ||0   || 0    ||...    ||12        || 0       || ...||
|| 0.81      || Jane  ||Doe     || A3      ||0   || 0    ||...    ||12        || 154     || ...||

除了

,实际上没有其他相关表。
  • 内存表中的辅助对象,具有ID表示的等级
  • 主题和学生的数据

我想选择所有字段(使用Laravel雄辩模型)和“最终成绩”,这是所有所选内容的总和...高于某个阈值。 (如下所示

SELECT *, a FROM `students` WHERE 
`name` LIKE "J%" AND `surname` LIKE "D" AND `section` = 'A3'
enter code here
AND (if(`math16`='12',0.76, 0)
+if(`geometry26`='13',0.76, 0) +if(`physics13`='325',1, 0)
+if(`programming06`='551',1, 0) +if(`biology18`='271',0.916, 0) 
+ .... )/18.216 as a > 0.75

'12','13','25','551','271'-是等级代码。

从技术上讲,我需要让所有学生或多或少的学生获得相同的课程,并且对于给定的名字起初字母都具有一定的平均成绩。 (我的意思是,如果我有约翰,他修过特定的课程[数学等级为0.76的数学16,生物学等级为0.91的生物学...,]和简[数学等级为0.76的数学16,编程等级为100的编程06,...],我想在没有其他学生的情况下将他们的成绩和成绩汇总在一起。

可能还有其他可能性将所有具有相同字段的行放在一起,但我无法做到这一点。 谢谢

2 个答案:

答案 0 :(得分:1)

我不建议将主题保留在students表中,而是应该进一步研究规范化数据库并添加subjectsstudent_subject表。但是,使用当前设置,您可以考虑在模型上创建属性,然后将其附加。

https://laravel.com/docs/5.7/eloquent-serialization#appending-values-to-json

class User {

    protected $appends = [
        'average_grade'
    ];

    public function getAverageGradeAttribute()
    {
        return $this->attributes['average_grade'] = ($this->math1 + $this->math2) / 2;
    }

}

这样做可以让您在视图中显示属性时简单地调用它,就像这样:

<table>
    <thead>
        <tr>
            <th>Student</th>
            <th>Average Grade</th>
        </tr>
    </thead>
    <tbody>
        @foreach($students as $student)
            <tr>
                <td>{{ $student->name }}</td>
                <td>{{ $student->average_grade }}</td>
            </tr>
        @endforeach
    </tbody>
</table>

答案 1 :(得分:0)

您可以执行以下操作来实现您的目的。假设您想获得表中 2 个字段的单个总和的总和,其中字段名称为 field1 和 field2,对于模型名称为 'ModelName' 的表,您可以执行以下操作:

$amount = ModelName::select(DB::raw('sum(field1 + field2) as total'))->get();