根据另一个 eloquent 查询的结果在循环中运行 eloquent 并在刀片中显示列表

Posted

技术标签:

【中文标题】根据另一个 eloquent 查询的结果在循环中运行 eloquent 并在刀片中显示列表【英文标题】:Running eloquent in loop and display list in blade based on result from another eloquent query 【发布时间】:2021-07-08 12:13:59 【问题描述】:

我有一个获取学生列表的查询,我正在使用 foreach 循环迭代并获取每个学生的 student_id。

在 foreach 循环中,我有另一个计算学生分数的查询。在计算学生分数时,我需要来自第一个查询的 student_id

逻辑

$students = DB::table('grades_students')
  ->join('users', 'grades_students.student_id', '=', 'users.id')
  ->join('grades', 'grades_students.grade_id', '=', 'grades.id')
  ->where('grades.stream_id', $request->stream_name)
  ->get()->pluck('student_id');


  foreach ($students as $student ) 

    $student_average=DB::select(DB::raw("select student_id,  round((SUM(t.mark))/'5') average_mark from (
        select marks.student_id,  ROUND(AVG(mark)) as mark  from marks
            INNER JOIN teaching_loads ON teaching_loads.id=marks.teaching_load_id
            INNER JOIN subjects ON subjects.id=teaching_loads.subject_id
        where marks.student_id = '$student' AND marks.assessement_id=1  
        GROUP BY subject_id
      )t "));


return view('analytics.view-test', compact('student_average'));   



现在的问题是刀片中只有一个学生出现,但我需要显示学生查询中所有学生的列表。

【问题讨论】:

您正在循环中覆盖$student_average。您需要创建一个数组以在循环中使用它 【参考方案1】:

您正在覆盖$student_average 每个循环,因此只有最后一个循环的内容存储在$student_average 中。您需要改用数组。

$student_averages = [];
foreach ($students as $student) 
    $student_averages[] = DB::select(...your query);

return view('analytics.view-test', compact('student_averages'));

然后,您将获得所有学生的平均成绩,并可以在您的视图中循环查看它们。

【讨论】:

代码可以运行了,谢谢你告诉我为什么只返回一个用户的逻辑【参考方案2】:

你应该这样做

// Create an array to store the value
$student_average = [];

foreach ($students as $student) 
    // Push result to array
    $student_average[] = DB::select(DB::raw("select student_id,  round((SUM(t.mark))/'5') average_mark from (
    select marks.student_id,  ROUND(AVG(mark)) as mark  from marks
        INNER JOIN teaching_loads ON teaching_loads.id=marks.teaching_load_id
        INNER JOIN subjects ON subjects.id=teaching_loads.subject_id
    where marks.student_id = '$student' AND marks.assessement_id=1  
    GROUP BY subject_id
  )t "));

【讨论】:

以上是关于根据另一个 eloquent 查询的结果在循环中运行 eloquent 并在刀片中显示列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Eloquent 中从模型中查询另一个表中引用的记录

Laravel 5 变量构造查询字符串 Eloquent

将 for 循环的结果附加到 Laravel 中的 eloquent 输出

为啥 eloquent orm 上的查询语句结果返回空值

使用空结果查询 laravel eloquent

在 Laravel 5 Eloquent 中获取原始 SQL 查询的结果