Laravel-哪里有哪里影响其他行

时间:2019-02-11 13:39:05

标签: php laravel

我有一个应用程序,我想根据子条件获取父记录。当前的问题是我有学生,他们有多个学习领域,而一个研究领域属于一个系。数据透视表constant_values具有属性students_study_fields

例如,我需要获取所有属于“ prf”教师且枢纽有study_status_id的学生及其学习领域。

所以我写这样的查询。

study_status_id = 1

但是此查询也获取了学生巫婆return Student::with(['studyfields' => function ($query1) use ($studyStatusId, $facultyAbbreviation) { $query1->whereHas('pivot', function ($query2) use ($studyStatusId, $facultyAbbreviation) { $query2->where('study_status_id', $studyStatusId); }); $query1->whereHas('studyprogram', function ($query4) use ($facultyAbbreviation) { $query4->whereHas('faculty', function ($query5) use ($facultyAbbreviation) { $query5->where('abbreviation', $facultyAbbreviation); }); }); }])->get(); ,因为存在记录,其中相同的学习领域(其代码)与学生(study_status_id = 2有联系)。

因此,如果某处存在枢轴上有study_status_id = 1的记录,但仅当当前行具有status = 1时,我就不想包括该研究区域

2 个答案:

答案 0 :(得分:0)

您需要链接查询...

return Student::with(['studyfields' => function ($query1) use ($studyStatusId, $facultyAbbreviation) {
    $query1->whereHas('pivot', function ($query2) use ($studyStatusId, $facultyAbbreviation) {
         $query2->where('study_status_id', $studyStatusId);
    })->whereHas('studyprogram', function ($query4) use ($facultyAbbreviation) {
         $query4->whereHas('faculty', function ($query5) use ($facultyAbbreviation) {
             $query5->where('abbreviation', $facultyAbbreviation);
         });
    });
}])->get();

否则,它将重新启动query1,因此您将不会得到AND类的查询,而只会得到第二部分

侧面注意:但是,如果要遍历每个值时有很多行,我想警告您whereHas是一个缓慢的查询。我个人更喜欢通过简单的->where查询并使用->whereIn方法来获取ID。

答案 1 :(得分:0)

我找到了适合自己情况的解决方案

$students = Student::with(['studyfields' => function ($q) use ($studyStatusId) {
            $q->whereHas('pivot')->where('study_status_id', $studyStatusId);
        }])
            ->whereHas('studyfields', function ($q) use ($facultyAbbreviation) {
                $q->whereHas('studyprogram', function ($q) use ($facultyAbbreviation) {
                    $q->where('faculty_abbreviation', $facultyAbbreviation);
                });
            })
            ->get();
        $students = $students->filter(function ($student) {
            return count($student->studyfields) > 0;
        })->values();

上面的查询从特定的教职员工获取所有学生,并且如果studyfields数组不包含特定的study_status,请保留为空数组,以便稍后我可以假设每个学生至少属于一个学习领域,从空数组中过滤集合。