Laravel のネストされたリレーションシップの問題: 複雑なデータ取得の解決
Laravel では、データベース テーブル間の複雑なリレーションシップをブリッジすることが困難になることがよくあります。イベントの参加者を ID で取得するシナリオを考えてみましょう。ただし、イベントと人物の関係チェーン内に中間テーブルが存在するため、このタスクは複雑になります。
この問題に対処するには、モデル間の関係を注意深く定義することが不可欠です。関連するモデルの関係を以下に詳しく説明します。
イベント モデル:
class Event extends Eloquent { public function city() { return $this->belongsTo('City'); } }
都市モデル:
class City extends Eloquent { public function companies() { return $this->hasMany('Company'); } }
会社モデル:
class Company extends Eloquent { public function persons() { return $this->hasMany('Person'); } }
個人モデル:
class Person extends Eloquent { public function eventscore() { return $this->belongsToMany('Event', 'event_scores', 'person_id', 'event_id')->withPivot('score')->withTimestamps(); } }
これらの関係を定義したら、問題を解決するために失敗した 2 つの試みを見てみましょう。 :
return Event::with('city')->with('company')->get();
return Event::with('city')->whereHas('companies', function($query) use ($company_id){ $query->where('company_id', $company_id); })->get();
究極の解決策は、eloquent の積極的読み込み機能を利用することにあります:
return Event::with('city.companies.persons')->get();
このクエリは、イベントとそれに関連する都市、企業、および関係者を取得します。
また、個人テーブルの特定のフィールドのみが必要な場合:
return Event::with(['city.companies.persons' => function ($query) { $query->select('id', '...'); }])->get();
以上がLaravel でネストされた関係を持つイベントの参加者を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。