【问题标题】:How to select from a table based on another table's values Eloquent?如何根据另一个表的值 Eloquent 从一个表中进行选择?
【发布时间】:2020-05-27 08:31:31
【问题描述】:

我正在尝试获取一些仍然活跃的学生的数据。即使我在同一张表中有来自不活跃学生的数据。

这是StudentAttendance

这是学生班

这是我提出的 Eloquent 查询:

        StudentAttendance::
          select('student_classes.active', 'student_attendances.student_id', 'student_attendances.classroom_id', 'classrooms.classroom', 'attendance_rules.option')
        ->join('classrooms', 'classrooms.id', '=', 'student_attendances.classroom_id')
        ->join('attendance_rules','attendance_rules.id', '=', 'student_attendances.attendance_id')
        ->join('student_classes', 'student_attendances.student_id', '=', 'student_classes.student_id')
        ->where('attendance_date', date("Y-m-d"))        
        ->orderBy('classrooms.classroom', 'ASC')
        ->get();

SQL:

select `student_classes`.`active`, `student_attendances`.`student_id`, `student_attendances`.`classroom_id`, `classrooms`.`classroom`, `attendance_rules`.`option` 
from `student_attendances` 
inner join `classrooms` on `classrooms`.`id` = `student_attendances`.`classroom_id` 
inner join `attendance_rules` on `attendance_rules`.`id` = `student_attendances`.`attendance_id` 
inner join `student_classes` on `student_attendances`.`student_id` = `student_classes`.`student_id` 
where `attendance_date` = '2020-02-11' 
order by `classrooms`.`classroom` asc

现在我的 Eloquent 查询结果如下:

您可以看到,classic_id 为 2 的 student_id 22 处于非活动状态,但它似乎有一次处于非活动状态,其余的则处于活动状态。如果我删除 student_classes 加入,我将不会得到所有重复的结果。

即使我在 StudentAttendance 中查询,目标是在 StudentClass 中显示学生今天活跃 (active=1) 的所有出勤情况。

【问题讨论】:

    标签: php mysql laravel join eloquent


    【解决方案1】:

    您需要将您的加入范围限定为 student_classes,以便仅查看活动记录。

    您可以通过在加入方法中使用回调来做到这一点:

    ->join('student_classes', function ($join) {
        $join->on('student_attendances.student_id', '=', 'student_classes.student_id')
            ->on('student_classes.classroom_id', '=', 'student_attendances.classroom_id')
            ->where('student_classes.active', 1);
    })
    

    查询构建器文档中的“高级连接子句”涵盖了这一点 - https://laravel.com/docs/5.8/queries#joins

    【讨论】:

    • 这并没有完全奏效,因为学生在一个班级不活跃,但他在其他班级活跃,所以我得到的结果表明他确实“活跃”。我必须做的是在连接中指定->on('student_classes.classroom_id', '=', 'student_attendances.classroom_id'),这样当我加入时它也指向类。
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2020-07-28
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多