ansioso carregando relacionamentos profundamente aninhados?
Pergunta
Eu tenho uma série de tabelas relacionadas assim;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
os relacionamentos na direção oposta são todos aceitos para exercícios de fases, o que também é hasMany com uma tabela dinâmica
aprofundar relacionamentos assim de acordo com a documentação funciona bem, obviamente
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
Preciso ser capaz de recuperar o conteúdo de um programa inteiro e pensei que poderia carregar ansiosamente cada relacionamento aninhado algo assim
$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();
mas ambos retornam uma FatalErrorException
Chamada para o método indefinido iluminar support fachades session :: newQuery ()
qual é a maneira correta de fazer isso?
Solução
Pela sua pergunta, posso ver que você tem um relacionamento aninhado como o seguinte.
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
É muito difícil saber quais dados devem ser carregados days
se não sabemos o weeks
.Da mesma forma para o sessions
também.Então, temos que carregar o weeks
dados primeiro então days
, então sessions
.
Na documentação do Laravel, podemos ver o carregamento ansioso usando a seguinte abordagem:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Carregando Laravel author
dados baseados em books
dados.
http://laravel.com/docs/eloquent#eager-loading
Tente carregar weeks
primeiro
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
ou:
Carregamento preguiçoso e ansioso:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
Outras dicas
Então encontrei o problema e pode ajudar alguém a saber a resposta.esse tópico me deu um momento aha fóruns laravel
Eu tenho um modelo chamado Session, o laravel usa esse nome em outro lugar do framework, dã, então quando ele tenta chamar meu modelo ele está na verdade chamando a outra classe de sessão de algum lugar profundo no framework.algumas das soluções que encontrei sugerem namespaces, mas não acho que isso funcione para mim porque a declaração de relacionamento simplesmente passa uma string com o nome da classe para o framework.Acho que isso significa que a chamada da classe acontece em outro lugar e eu precisaria colocar o namespace /use lá, corrija-me se estiver errado, por favor.
de qualquer forma, mudar a classe de sessão para Sessionss e alterar os relacionamentos para se adequar resolveu meu problema.
Espero que isso ajude alguém a não perder 36 horas tentando descobrir isso: p