Laravel - 帮助急切加载辅助关系(我目前运行了364个SQL查询)

Swi*_*ftD 0 php sql laravel eloquent laravel-4

我在Laravel 4中建立一个站点的管理员端,并且正在努力使一切都在雄辩中发挥作用.我正在尝试构建一个具有多个关系的对象.这似乎工作正常,直到我尝试加载次要关系.

这是我对YourDetail模型的调用:

$applicants = YourDetail::with(array('User', 'Application', 'SecondaryEds', 'SecondaryEds.SecondaryTypes', 'SecondaryEds.SecondaryGrades', 'FurtherEds', 'FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades', 'UniEds', 'UniEds.UniClassifications', 'UniEds.UniQualifications', 'WorkExperiences', 'WhyYou', 'StartDate', 'Referer'))->whereIn('user_id', $applicants);
Run Code Online (Sandbox Code Playgroud)

我的所有关系都在各种模型中定义,并且直接使用时工作正常.我遇到的问题是次要关系,例如

FurtherEds.FurtherTypes,FurtherEds.FurtherGrades,UniEds.UniClassifications,UniEds.UniQualifications,

等等

现在当我运行查询时,我得到了我所期望的 - 大约20个表示各种模型的选择查询,生成的选择查询带来了'FurtherEds.FurtherGrades'模型,例如如下所示:

select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好...

当我尝试通过集合对象访问这些模型时出现问题;

所以我要说我现在循环遍历我的集合,将每个对象传递给一个如下所示的视图:

foreach($applicants as $applicant){
    View::make('ApplicantView', compact('applicant'));
}
Run Code Online (Sandbox Code Playgroud)

然后在我的视图中,我尝试遍历FurtherEds并回显出FurtherGrades模型的属性:

ApplicantView.blade.php

@foreach($applicant->FurtherEds as $fe)
    {{ $fe->FurtherGrades->name }}
@endforeach
Run Code Online (Sandbox Code Playgroud)

这将为每个申请人创建一个新的SQL查询,尽管我尝试过急切加载,例如

select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` = ? limit 1 (for each applicant)
Run Code Online (Sandbox Code Playgroud)

最终的结果是我的页面目前正在生成364个选择查询,虽然页面加载速度不差但似乎有点过分.

谁能解释我在这里做错了什么,并指出我正确的方向.

Swi*_*ftD 5

对任何有兴趣的人

我现在已经解决了这个问题:

看起来我正在做的是正确加载关系,但错误地访问它们.因此,例如,如果您急切地加载这样的关系:

$applicants = YourDetail::with('FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades');
Run Code Online (Sandbox Code Playgroud)

然后你应该像这样访问元素:

@foreach($applicants as $applicant)
@foreach($applicant->FurtherEds as $fe)
  {{ $fe->FurtherTypes->name }}
@endforeach
@endforeach
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是使用错误的大小写来访问较低的模型:

例如.

@foreach($applicants as $applicant)
@foreach($applicant->furtherEds as $fe)
  {{ $fe->furtherTypes->name }}
@endforeach
@endforeach
Run Code Online (Sandbox Code Playgroud)

Laravel非常聪明,可以识别模型中的关系,因此它知道要访问的内容,但它不能识别$applicant->furtherEds与渴望加载的模型对象相同,$applicant->FurtherEds而是生成新的SQL查询.

当我在一个稍微复杂的页面上完成这几次时,我有2000多个SQL查询.经验教训......再也不会

ps现在我已经找到了如何正确使用它Eloquent是正式有史以来最好的东西,绝对值得坚持,如果你遇到麻烦.