Php 渴望加载深度嵌套的关系?
我有一系列这样的相关表格Php 渴望加载深度嵌套的关系?,php,mysql,database,laravel-4,eloquent,Php,Mysql,Database,Laravel 4,Eloquent,我有一系列这样的相关表格 trainers -> hasMany -> programs programs -> hasMany -> weeks weeks -> hasMany -> days days -> hasMany -> sessions sessions -> hasMany -> phases phases -> hasMany -> excersises 相反方向的关系都有一个接受到阶段的练习,这个接受
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();
或
但两者都返回了一个致命的错误
调用未定义的方法
照亮\Support\Facades\Session::newQuery()
正确的方法是什么?从你的问题中,我可以看出你有如下嵌套关系
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
如果我们不知道周数
,就很难知道在天
中应该加载哪些数据。同样,对于会话
。因此,我们必须先加载周
数据,然后加载天
,然后加载会话
从Laravel文档中,我们可以看到,使用以下方法快速加载:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
根据书籍
数据加载作者
数据
尝试先加载周
$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');
所以我发现了这个问题,它可能会帮助其他人知道答案。这根线给了我一个惊喜 我有一个名为Session的模型,laravel在框架的其他地方使用这个名称duh,所以当它试图调用我的模型时,实际上是在框架的深处调用另一个Session类。我发现的一些解决方案建议使用名称空间,但我认为这对我不起作用,因为关系声明只是将带有类名的字符串传递给框架。我认为这意味着类的调用发生在其他地方,我需要将名称空间/用法放在那里。如果我错了,请纠正我 无论采用哪种方式,将会话类更改为sessions,并根据需要更改关系,都解决了我的问题
我希望这有助于其他人不要浪费36个小时试图弄明白这一点:p因为这相对于标题来说是可行的,我会将其标记为已接受,但如果有人遇到与我相同的错误,请参见下面的答案。这样做将有效。即使您提供了字符串,Laravel也会尊重关系中的名称空间。
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');