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 ?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top