2016-05-10 106 views
0

我一直在努力弄清楚過去兩天的表關係,我敢肯定,解決方案很簡單,但它暗指我。棘手的雄辯查詢

四個表/模型都參與(包括數據透視表):

  1. Skill - 技能表。 A Skill屬於SkillGroup並屬於許多Candidates(candidate_skill數據透視表)
  2. Candidate - 候選人表。包含候選人的個人信息,與問題無關。
  3. SkillGroup - skill_groups表。每個技能組都有很多技能。

我希望能夠檢索由SkillGroup分組的Candidate擁有的技能對象。例如:

[ 
    { 
    "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 s的給定ID的Candidate

回答

2

您想通過數據透視表屬性進行查詢,但是您查詢的是candidates.candidate_id屬性。

你可以這樣說:

\App\SkillGroup::with(['skills.candidates' => function($query) { 
    $query->wherePivot('candidate_id', 6); 
}])->get();