0

我正在 Laravel 4 中构建一个站点的管理端,并试图让一切都在 eloquent 中运行。我正在尝试构建具有多个关系的对象。在我尝试加载次要关系之前,这似乎工作正常。

这是我对 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);

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

ForwardEds.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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

到现在为止还挺好...

当我尝试通过集合对象访问这些模型时,问题就来了;

因此,假设我现在遍历我的集合,将每个对象传递给这样的视图:

foreach($applicants as $applicant){
    View::make('ApplicantView', compact('applicant'));
}

然后在我看来,我尝试遍历FurtherEds并回显出FurtherGrades模型的一个属性:

申请人视图.blade.php

@foreach($applicant->FurtherEds as $fe)
    {{ $fe->FurtherGrades->name }}
@endforeach

这现在将为每个申请人创建一个新的 sql 查询,尽管我尝试进行预加载,例如

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

最终结果是我的页面当前正在生成 364 选择查询,尽管页面加载速度还不错,但似乎有点过分。

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

4

2 回答 2

5

对任何有兴趣的人...

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

看来我正在做的是正确加载关系但不正确地访问它们。因此,例如,如果您渴望像这样加载关系:

$applicants = YourDetail::with('FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades');

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

@foreach($applicants as $applicant)
@foreach($applicant->FurtherEds as $fe)
  {{ $fe->FurtherTypes->name }}
@endforeach
@endforeach

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

例如。

@foreach($applicants as $applicant)
@foreach($applicant->furtherEds as $fe)
  {{ $fe->furtherTypes->name }}
@endforeach
@endforeach

Laravel 足够聪明,仍然可以识别模型中的关系,因此它知道要访问什么,但它不能识别$applicant->furtherEds为与预先加载的模型对象相同,$applicant->FurtherEds而是生成新的 sql 查询。

当我在一个稍微复杂的页面上做了几次时,我有 2000 多个 sql 查询。吸取的教训......再也不会

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

于 2013-10-09T14:40:15.297 回答
1

尝试像这样加载次要相关模型:

// from the docs
You may even eager load nested relationships:

$books = Book::with('author.contacts')->get();

http://laravel.com/docs/eloquent#eager-loading

于 2013-10-08T17:07:07.447 回答