gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:17:35 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com