Получение записей от строки к столбцу в формате json laravel - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу получить такой результат в формате json идентификатор студента.

Для идентификатора студента 1

data:
0:
Exam_Name : "first term"
marks : "English : 75, Math : 80, Science : 70"
1:
Exam_Name : "second term"
marks : "English : 72, Math : 82, Science : 86"

Есть две таблицы результатов экзамена и экзамена

Exam has id, name, class_id columns

id         name           class_id
1       first term             1
2       second term            1

Exam_Results has exam_id, student_id  subject, marks columns

id       exam_id     student_id        subject      marks
1         1            1                english       75
2         1            1                 math         80
3         1            1                science       70
4         2            1                english       72
5         2            1                 math         82
6         2            1                science       86

Вот мой файл контроллера

$student = Student::find($id);
$results =ExamResults::join('exam','exam_results.exam_id', '=', 'exam.id')
        ->select('exam.name','exam_results.*')
        ->where('student_id',$student->id)->get();

$data   = [];

foreach($results as $row){
    $data[] = [
        'exam_name'     =>$row->name,
        'marks'         =>$row->subject." : ".$row->marks,
        ];
}
return response()->json(['data' => $data,]);

с этим им получающимся результатом, как показано ниже, названия экзаменов повторяются.

data:
0:
exam_name: "first term"
marks: "english : "75"
1:
exam_name: "first term"
marks: "math : "80"
2:
exam_name: "first term"
marks: "science : "70"
3:
exam_name: "second term"
marks: "english : "72"
4:
exam_name: "second term"
marks: "math : "82"
5:
exam_name: "second term"
marks: "science : "86"

Но я хочу, чтобы имя экзамена раз и все предметы с отметками с ним. Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Я решил это, сделав это

$student = Student::find($id);      
$exams = ExamResults::where('student_id',$id)->select('exam_id')
         ->orderBy('exam_id','DESC')->distinct()
         ->pluck('exam_id')->toArray();

    $data   = [];           
    foreach($exams as $exam)
    {
         $exm = Exam::where('id',$exam)->first();
         $mark = ExamResults::where('exam_id',$exm->id)->where('student_id',$student->id)
                 ->pluck('marks','subject');

    $data[] = [         

              'name'        => $exm->name,
              'marks'       => $mark

              ];

    }

        return response()->json(['data' => $data]);

0 голосов
/ 06 апреля 2020

Все, что вам нужно сделать сейчас, это просто использовать метод laravel collection groupBy и сгруппировать коллекцию по имени экзамена. Но я предлагаю вам использовать exam_id, который является уникальным.

$collection = collect([
    ['exam_id' => 1, 'exam_name' => 'first term', 'marks' => 'english : 75'],
    ['exam_id' => 1, 'exam_name' => 'first term', 'marks' => 'math  : 80'],
    ['exam_id' => 2, 'exam_name' => 'second term', 'marks' => 'english  : 77'],
    ['exam_id' => 2, 'exam_name' => 'second term', 'marks' => 'math  : 88']
]);

$groupedByExamName = $collection->groupBy('exam_name');
$mappedData = $groupedByExamName->map(function ($exam) {
    return collect($exam)->pluck('marks');
});

print_r($mappedData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...