【发布时间】:2014-06-26 22:02:47
【问题描述】:
我有一个简单的“项目”模型。一个项目可以有很多任务,每个任务都属于一个员工。 我有一个页面显示 +- 100 个项目,以及所有相关的(独特的)员工。这导致执行了 500 多个查询,因此页面加载时间飙升至不可接受的水平。所以我尝试了急切的加载:
$projects->with(array('tasks' => function($query)
{
$query->select('project_id', 'employee_id')->distinct()->get();
}));
据我通过调试可以看出,这给了我想要的结果。对于每个项目,任务都被正确检索,没有重复的员工。
但是。当我尝试在视图中加载任务时,Laravel 仍在执行 400 多个查询来检索每个项目的任务。
@foreach ($projects as $project)
@foreach($project->tasks as $task)
@if($task->employee_id != 0 )
<img src="{{UserHelper::getGravatarUrl($task->employee->id)}}" alt="{{{ $task->employee->name }}}"
@endif
@endforeach
@endforeach
我曾尝试使用 tasks() 和 tasks()->get() 代替,但无济于事。如何访问急切加载的属性?
我不喜欢使用脏的原始查询,因为 Eloquent 应该能够胜任这项任务。
【问题讨论】:
标签: php mysql laravel-4 eager-loading