我有一系列相关的表格;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
相反方向的关系都有一个接受阶段的例外,这个阶段也有一个数据透视表
根据文档工作得到的关系非常明显
$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
调用未定义的方法 照亮\支持\外墙\会话:: newQuery()
这是做正确的方法吗?
答案 0 :(得分:2)
根据你的问题,我可以看到你有如下的嵌套关系。
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
如果我们不知道days
,很难知道weeks
应该加载哪些数据。同样适用于sessions
。因此,我们必须首先加载weeks
数据,然后加载days
,然后加载sessions
。
从Laravel文档中,我们可以看到,使用以下方法加载Eager:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Laravel基于author
数据加载books
数据。
http://laravel.com/docs/eloquent#eager-loading
尝试先加载weeks
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
或强>
Lazy Eager Loading:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
答案 1 :(得分:1)
所以我发现了问题,这可能有助于其他人知道答案。这个帖子给了我一个时刻laravel forums
我有一个名为Session的模型,laravel在框架的其他地方使用该名称,所以当它试图调用我的模型时,它实际上是从框架深处的某个地方调用另一个会话类。我发现的一些解决方案建议命名空间,但我不认为这对我有用,因为关系声明只是将带有类名的字符串传递给框架。我认为这意味着该类的调用发生在其他地方,如果我错了,我需要把命名空间/用在那里纠正我。
以任何方式将会话类更改为Sessionss并将关系更改为适合已解决了我的问题。
我希望这可以帮助别人不浪费36个小时试图解决这个问题:p