Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 渴望加载深度嵌套的关系?_Php_Mysql_Database_Laravel 4_Eloquent - Fatal编程技术网

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');