문제

나는 이와 관련된 일련의 테이블을 가지고 있습니다.

trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises

반대 방향의 관계는 모두 피벗 테이블을 사용하여 hasMany인 단계에 대한 연습을 허용합니다.

문서에 따라 이렇게 깊은 관계를 맺는 것은 분명히 잘 작동합니다.

$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을 반환합니다.

undefined method rilluminate support facades session :: newQuery ()로 호출하십시오.

이를 수행하는 올바른 방법은 무엇입니까?

도움이 되었습니까?

해결책

귀하의 질문에서 다음과 같은 중첩 관계가 있음을 알 수 있습니다.

programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions

어떤 데이터를 로드해야 하는지 알기가 매우 어렵습니다. days 우리가 모른다면 weeks.마찬가지로 sessions 또한.그래서 우리는 weeks 데이터를 먼저 그 다음 days, 그 다음에 sessions.

Laravel 문서에서 다음 접근 방식을 사용하여 Eager 로딩을 볼 수 있습니다.

select * from books

select * from authors where id in (1, 2, 3, 4, 5, ...)

라라벨 로딩 author 데이터를 기반으로 books 데이터.

http://laravel.com/docs/eloquent#eager-loading

로드해 보세요 weeks 첫 번째

$programs = $this->program->orderBy('trainerId', 'asc')
   ->take(1)
   ->with('weeks', 'weeks.days', 'weeks.days.sessions')
   ->get();

또는:

Lazy Eager 로딩:

 $programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();

 $programs->load('weeks', 'weeks.days', 'weeks.days.sessions');

다른 팁

그래서 나는 그 문제를 발견했고 다른 사람이 답을 알아야하는 데 도움이 될 수 있습니다.이 스레드는 나에게 aha를 찍었습니다 Laravel 포럼

나는 세션이라는 모델을 가지고 있으며, Laravel은 프레임 워크의 다른 곳에서 해당 이름을 사용하므로 모델을 호출하려고 할 때 실제로 프레임 워크 어딘가에서 다른 세션 클래스를 호출하는 것입니다.내가 발견 한 솔루션 중 일부는 네임 스페이스를 제안하지만 관계 선언이 프레임 워크에 클래스 이름으로 문자열을 전달하기 때문에 나에게 작동하지 않는다고 생각하지 않습니다.나는 이것이 클래스의 부름이 다른 곳에서 일어나는 것을 의미한다는 것을 의미한다고 생각합니다. 나는 네임 스페이스를 넣어야합니다 / 틀림없이 나를 바로 잡아주세요.

세션 클래스를 세션으로 변경하고 적합한 관계를 변경하면 내 문제가 해결되었습니다.

나는 이것이 다른 사람이 36 시간을 낭비하지 않기를 돕기를 바랍니다 : p

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top