2017-07-24 34 views
1

我有表的学生,型材,科目和数据透视表profile_subject提供预先加载额外的条件包括两个列的比较,laravel

-students --------- {ID,PROFILE_ID,一年}

-profiles ---------(编号)

-profile_subject - {PROFILE_ID,subject_id,一年}

-subjects --------- { id}

I想要选择一个ID为5的学生,并且渴望加载个人资料和学生年份的科目。

事情是这样的:

$student = Student::with('profile','profile.subjects')->find(5); 

但我也必须插入条件

->wherePivot('year','=','students.year') 

某处。怎么做? 这个查询不会做这个工作,它会搜索哪一年的记录是“students.year”文学

回答

1

使用lazy eager loading。此代码不会创建任何额外的查询,它将创建与with()相同数量的查询:

$student = Student::find(5); 
$sudent->load(['profile', 'profile.subjects' => function ($q) use ($student) { 
    $q->wherePivot('year', $student->year); 
}]); 
+1

嗯,如果它工作的很好!如果我需要它为所有的学生只是循环通过foreach? –

+1

是的,但由于它是嵌套关系,foreach语法对于不同类型的关系会有点不同。 –

+0

太好了,谢谢! :)非常强大这懒惰渴望,奇怪的是他们没有强调一点,我即将频繁使用 –