我有一个应用程序,我想根据子条件获取父记录。当前的问题是我有学生,他们有多个学习领域,而一个研究领域属于一个系。数据透视表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
时,我就不想包括该研究区域
答案 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,请保留为空数组,以便稍后我可以假设每个学生至少属于一个学习领域,从空数组中过滤集合。