雄辩的ORM查询仅返回其集合中具有特定模型的模型

时间:2014-05-14 21:22:35

标签: database orm eloquent

我正在努力让Eloquent ORM产生我需要的结果。我有三个模型,工作,阶段和团队。

工作模式

public function phases()
{
    return $this->hasMany('Eloquent\Models\Phase', 'job_id', 'job_id');
}

阶段模型

public function job()
{
    return $this->belongsTo('Eloquent\Models\Job', 'job_id', 'job_id');
}

public function teams()
{
    return $this->hasMany('Eloquent\Models\Team', 'phase_id', 'phase_id');
}

团队模型

public function phase()
{
    return $this->belongsTo('Eloquent\Models\Phase', 'phase_id', 'phase_id');
}

执行查询时

$query = Eloquent\Models\Job::with("Phases.Teams");
$result = $query->get();

我得到40个工作岗位,其中包括50个阶段和75个团队。好的。

执行查询时

$query = Eloquent\Models\Job::with(array("Phases.Teams" => function($query)
{
    $query->whereRaw("teams.team_member_quota > 5");
}));

我收集了40个职位,其中包括50个阶段和20个团队。我似乎仍然可以获得所有的工作和阶段,但只有团队已被过滤。

我想获得一个只有一个团队拥有team_member_quota>的职位的集合。 5,并且只有拥有team_member_quota>的团队的阶段5,与Phases一起只有团队成员team_member_quota> 5。

这是否可以使用Eloquent ORM?

2 个答案:

答案 0 :(得分:0)

您需要whereHas,但由于它不适用于嵌套关系,因此您需要手动嵌套:

$query = Eloquent\Models\Job::whereHas('phases', function($query)
{
    $query->whereHas('teams', function ($q) {
        $q->whereRaw("teams.team_member_quota > 5");
    });
})
// ->with('phases.teams') // if you still need to load all the relations
;

这将获取JobsPhases Teams相关的hasManyThrough> 5名成员(如果需要,还可以加载这些工作的所有相关模型)


或者定义另一个// Job model public function teams() { return $this->hasManyThrough('Team', 'Phase'); } // then: $query = Eloquent\Models\Job::whereHas('teams', function ($q) { $q->whereRaw("teams.team_member_quota > 5"); }); 关系:

hasManyThrough

对于$primaryKey,您需要确保所有模型都已定义id,因为您似乎没有使用默认{{1}}。

答案 1 :(得分:0)

这确实将作业限制为仅包含其team_member_quota>的团队的作业。 5

$query = Eloquent\Models\Job::whereHas('phases', function($query)
{
    $query->whereHas('teams', function ($q) 
    {
        $q->whereRaw("teams.team_member_quota > 5");
    });
});

然而,在"中添加"条款

$query->with('phases.teams');

仍会带回每个工作的所有阶段,无论是否包含符合条件的团队,以及这些阶段中的所有团队,无论他们是否拥有team_member_quota> 5或不。

我发现了这个""条款工作

$query->with(array(
    "phases" => function($q1)
    {
        $q1->whereHas('teams', function($q2)
        {
            $q2->whereRaw('teams.team_member_quota > 5');
        });
    },
    "phases.teams" => function($q)
    {
        $q->whereRaw("teams.team_member_quota > 5");
    }
));

仅提供包含符合条件的团队的阶段,以及符合结果标准的团队。