désireux de charger des relations profondément imbriquées ?
Question
J'ai une série de tableaux liés comme ceci ;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
les relations dans le sens inverse sont toutes à accepter pour les excisers vers les phases qui sont également nombreuses avec un tableau croisé dynamique
obtenir des relations aussi profondes que celle-ci selon la documentation fonctionne bien évidemment
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
J'ai besoin de pouvoir récupérer le contenu d'un programme entier et j'ai pensé que je pourrais charger avec impatience chaque relation imbriquée, comme ceci
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days', 'weeks.days.sessions')->get();
ou
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days.sessions')->get();
mais les deux renvoient une FatalErrorException
Appel à la méthode non définie illuminer Support FACADES SESSION :: newQuery ()
quelle est la bonne façon de procéder ?
La solution
D'après votre question, je peux voir que vous avez une relation imbriquée comme celle-ci.
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
Il est très difficile de savoir à quoi servent les données days
si nous ne connaissons pas le weeks
.De même pour le sessions
aussi.Il faut donc charger le weeks
les données d'abord puis days
, alors sessions
.
Dans la documentation Laravel, nous pouvons voir un chargement impatient en utilisant l'approche suivante :
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Chargement de Laravel author
données basées sur books
données.
http://laravel.com/docs/eloquent#eager-loading
Essayez de charger weeks
d'abord
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
ou:
Chargement paresseux et impatient :
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
Autres conseils
Alors j'ai trouvé le problème et cela pourrait aider quelqu'un d'autre à connaître la réponse.Ce fil m'a donné le moment Aha Forums Laravel
J'ai un modèle appelé session, Laravel utilise ce nom ailleurs dans le cadre, DUH, donc lorsqu'il tente d'appeler mon modèle, il appelle en réalité l'autre classe de session de quelque part en profondeur dans le cadre.Certaines des solutions que j'ai trouvées suggèrent des espaces de noms, mais je ne pense pas que cela fonctionnera pour moi, car la déclaration de relation passe simplement une chaîne avec le nom de la classe dans le cadre.Je pense que cela signifie que l'appel de la classe arrive ailleurs et je devrais mettre l'espace de noms / utiliser là-bas, corrigez-moi si je me trompe s'il vous plaît.
L'une ou l'autre voie modifie la classe de session en sessions et en modifiant les relations en fonction de la résolution de mon problème.
J'espère que cela aidera quelqu'un d'autre à ne pas perdre 36 heures à essayer de comprendre cela: p