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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top