Красноречиво, как получить рассчитанную сумму полей в новом поле - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть таблица БД students со всеми итоговыми оценками для каждого предмета, что является целым числом, и рядом других полей, таких как имя и т. Д.

students (таблицаИмея более 100 столбцов, каждая ячейка может иметь некоторый предварительно установленный идентификатор, который позже переводится в оценки / некоторую глупую технику защиты от взлома, где несколько чисел могут представлять одну оценку /)

|| 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      || ...||

DESIRABLEРЕЗУЛЬТАТ

|| 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     || ...||

Буквально НЕТ других связанных таблиц, за исключением

  • вспомогательной таблицы памяти с оценками для представления идентификаторов
  • предметов и данных учащихся

Я хочу получить выбранные (используя красноречивую модель 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 '- это коды классов.

Технически, мне нужно получитьвсе студенты, которые получили более или менее одинаковые курсы с некоторыми средними оценками для данной начальной буквы имени (я имею в виду, если у меня есть Джон, который посещал определенные курсы [математика 16 с классом 0,76, биология18 с классом 0,91, ...] и Джейн [математика 16 с 0,76, программирование 06 с 100, ...], я хотел бы собрать их записи, с суммой их оценок, без остальных учеников.

Возможно, есть некоторая другая возможность собрать все строки с какими-то одинаковыми полями вместе, но я не могу понять, как я могу это сделать. Спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

Я бы не рекомендовал сохранять темы в таблице students, вместо этого вам следует изучить вопрос нормализации базы данных и добавить таблицу subjects и student_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>
...