我正在努力让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?
答案 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
;
这将获取Jobs
与Phases
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");
}
));
仅提供包含符合条件的团队的阶段,以及符合结果标准的团队。