我有一系列这样相关的表;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
相反方向的关系都是has one accept for exercises to phases也是hasMany with a pivot table
按照文档建立这样深的关系显然效果很好
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
我需要能够检索整个程序的内容,我认为我可以像这样急切地加载每个嵌套关系
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days', 'weeks.days.sessions')->get();
或
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days.sessions')->get();
但两者都返回 FatalErrorException
Call to undefined method Illuminate\Support\Facades\Session::newQuery()
正确的做法是什么?
最佳答案
从你的问题中,我可以看出你有如下嵌套关系。
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
如果我们不知道周
,就很难知道天
应该加载什么数据。对于 sessions
也是类似的。因此,我们必须先加载 weeks
数据,然后是 days
,然后是 sessions
。
从Laravel文档中我们可以看到,Eager loading使用了以下方式:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Laravel 根据books
数据加载author
数据。
http://laravel.com/docs/eloquent#eager-loading
先尝试加载 weeks
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
或:
延迟急切加载:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
关于php - 渴望加载深层嵌套关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002737/