2016-05-10 2 views
0

Я изо всех сил пытался выяснить связь таблицы за последние два дня, я уверен, что решение прост, но это намекает на меня.Tricky Eloquent query

Четыре таблицы/модели участвуют (в том числе сводной таблицы):

  1. Skill - таблица навыков. A Skill принадлежит к SkillGroup и принадлежит ко всем Candidates (official_skill pivot table)
  2. Candidate - таблица кандидатов. Содержит личную информацию о кандидате, которая не связана с проблемой.
  3. 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(); 

Любая помощь была бы принята с благодарностью, спасибо!

EDIT

Благодаря @Giedrius Kirš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 с с Candidate с заданным идентификатором.

ответ

2

Вы хотите запросить атрибут таблицы поворота, но вы запрашиваете атрибут candidates.candidate_id.

Вы можете сделать это следующим образом:

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