熱心な荷を深く入れ子になった関係は?
質問
私はそのような一連のテーブルを持っています;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
.
反対方向の関係はすべて、ピボットテーブル
でハメミーであるフェーズへの抜粋の1つの受け入れを持っています。関係のようなもののようにこのような深さを得ることは明らかにうまく機能します
$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
を返します。未定義の方法への呼び出し Illuminate \ Support \ Facades \ Session :: NewQuery()
これを行う正しい方法は何ですか?
解決
あなたの質問から、私はあなたが次のようにネストされた関係があるのを見ることができます。
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
.
days
を知らない場合は、weeks
にどのデータをロードする必要があるかを知ることは非常に困難です。sessions
も同様に。したがって、まずweeks
、次にdays
をロードしてからsessions
をロードする必要があります。
Laravelのマニュアルから、次のアプローチを使用して読み込んで、積極的に読み込むことができます:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
.
Laravelは、author
データに基づくbooks
データをロードします。
http://laravel.com/docs/eloquent#eArlashing
weeks
をロードしようとする最初の
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
.
または:
怠惰な熱心な積み込み:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
. 他のヒント
だから私は問題を見つけました、そして他の誰かが答えを知るのを助けるかもしれません。このスレッドは私にAHAの瞬間を与えました LARAVERフォーラム
セッションと呼ばれるモデルを持っています、Laravelはフレームワークの他の場所でその名前を使いました。私が見つけた解決策のいくつかは、名前空間を示唆しているが、関係宣言は単にクラス名をフレームワークに文字列を渡すために私のために働くとは思わない。これは、クラスの呼び出しが他の場所で行われ、名前空間を置く必要があると私が間違っていれば私を訂正する必要があると思います。
どちらかの方法でセッションクラスをセッションに変更し、リレーションシップをスーツに変更すると、問題が解決しました。
私はこれが他の誰かがこれを理解しようとしている36時間無駄にないのを助けることを願っています:P