过去两天我一直在努力找出一个表格关系,我确信解决方案很简单,但它暗指我。
涉及四个表/模型(包括数据透视表):
Skill
- 技能表。 Skill
属于SkillGroup
,属于许多Candidates
(candidate_skill数据透视表)Candidate
- 候选人表。包含候选人的个人信息,与问题无关。SkillGroup
- skill_groups表。每个技能组都有很多技能。我希望能够检索由Candidate
分组的SkillGroup
所拥有的技能对象。例如:
[
{
"id": 1,
"title": "Information Technology (Skill Group)",
"slug": "information-technology",
"created_at": "2016-05-07 23:58:23",
"updated_at": "2016-05-07 23:58:23",
"skills": [
{
"id": 1,
"title": "Web Development (Skill)",
"slug": "web-development",
"description": "Web developers primarily focus on the back-end of websites",
"created_at": "2016-05-07 23:58:55",
"updated_at": "2016-05-07 23:58:55",
"skill_group_id": 1,
"candidates": [
{
"first_name": "John (Candidate)",
"last_name": "Smith",
"pivot": {
"skill_id": 1,
"candidate_id": 6
}
}
]
}
]
}
]
使用以下代码很容易实现,但我想仅检索特定候选人的结果(SkillGroup
- > Skills
- > Candidate
)。
\App\SkillGroup::with('skills.candidates')->get();
我尝试了以下(以及我能想到的其他所有内容),candidate_id似乎不会影响查询 - 我看到了给定候选人不具备的技能。
\App\SkillGroup::with(['skills.candidates' => function($query) {
$query->whereCandidateId(6);
}])->get();
非常感谢任何帮助,谢谢!
修改
感谢@GiedriusKiršys,我能够提出以下建议:
\App\SkillGroup::with(['skills.candidates' => function($query) {
$query->wherePivot('candidate_id', 8)->addSelect('candidates.id', 'first_name', 'last_name');
}])->whereHas('skills.candidates', function($q) {
$q->whereCandidateId(8);
})->get();
这仅使用带有SkillGroup
Skill
的{{1}}检索Candidate
次结果。
答案 0 :(得分:2)
您希望按透视表属性进行查询,但是您要按candidates.candidate_id
属性进行查询。
你可以这样做:
\App\SkillGroup::with(['skills.candidates' => function($query) {
$query->wherePivot('candidate_id', 6);
}])->get();