棘手的Eloquent查询

时间:2016-05-10 03:41:29

标签: php mysql json laravel eloquent

过去两天我一直在努力找出一个表格关系,我确信解决方案很简单,但它暗指我。

涉及四个表/模型(包括数据透视表):

  1. Skill - 技能表。 Skill属于SkillGroup,属于许多Candidates(candidate_skill数据透视表)
  2. Candidate - 候选人表。包含候选人的个人信息,与问题无关。
  3. SkillGroup - skill_groups表。每个技能组都有很多技能。
  4. 我希望能够检索由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次结果。

1 个答案:

答案 0 :(得分:2)

您希望按透视表属性进行查询,但是您要按candidates.candidate_id属性进行查询。

你可以这样做:

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