php - 渴望加载深层嵌套关系?

标签 php mysql database laravel-4 eloquent

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

trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises

相反方向的关系都是has one accept for exercises to phases也是hasMany with a pivot table

按照文档建立这样深的关系显然效果很好

$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

Call to undefined method Illuminate\Support\Facades\Session::newQuery()

正确的做法是什么?

最佳答案

从你的问题中,我可以看出你有如下嵌套关系。

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

如果我们不知道,就很难知道应该加载什么数据。对于 sessions 也是类似的。因此,我们必须先加载 weeks 数据,然后是 days,然后是 sessions

从Laravel文档中我们可以看到,Eager loading使用了以下方式:

select * from books

select * from authors where id in (1, 2, 3, 4, 5, ...)

Laravel 根据books 数据加载author 数据。

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

关于php - 渴望加载深层嵌套关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002737/

相关文章:

java - 在 PHP 中寻找像简单 html dom 一样的 java html 解析器

php - 如何解码json ajax响应

php - Laravel 在主帐户上为所有员工提供服务

php - 如何使用迁移重命名 laravel 中的列?

java - 如何在 JDBC 中使用 MySQL 子查询?

mysql - 在线 SQL 编辑器(或不),自动将 sql 命令大写(例如 SELECT、AND、THEN、DISTINCT、DROP...)

sql - 如何使用 SQL 为每个 MANAGER_ID 的每个员工添加剩余工资

mysql - 比较字符串长度相等

python - 将多个 .ui 文件导入 main.py 文件

php - 在 Python 中实现 preg_match_all