渴望加载深层嵌套的关系?

时间:2014-01-08 17:40:54

标签: php mysql database laravel-4 eloquent

我有一系列相关的表格;

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()

这是做正确的方法吗?

2 个答案:

答案 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