我有一系列像这样相关的表格;

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

调用未定义方法 Illuminate\Support\Facades\Session::newQuery()

正确的方法是什么?

有帮助吗?

解决方案

从你的问题中,我可以看到你有像下面这样的嵌套关系。

programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions

很难知道应该加载哪些数据 days 如果我们不知道 weeks.同样地, sessions ""好吧。所以,我们必须装载 weeks 数据先然后 days, ,则 sessions.

从Laravel文档中,我们可以看到,使用以下方法加载:

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

或:

懒惰的渴望加载:

 $programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();

 $programs->load('weeks', 'weeks.days', 'weeks.days.sessions');

其他提示

所以我发现了这个问题,它可能有助于别人知道答案。这个帖子给了我一个啊拉时刻 laravel论坛

我有一个名为session的模型,Laravel在框架中的其他地方使用该名称,所以当它试图调用我的模型时,它实际上是从框架深处的某个地方调用其他会话类。我找到的一些解决方案建议命名空间,但我不认为这将为我工作,因为关系声明只需将一个字符串传递给框架。我认为这意味着课堂上的呼叫发生在其他地方,我需要把命名空间/用来纠正我,如果我错了,请纠正我。

要么将会话类更改为会话和更改要适应的关系已经解决了我的问题。

我希望这有助于别人不会浪费36小时试图弄清楚这个:p

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top