Laravel でネストされた関係を持つイベントの参加者を効率的に取得するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-13 17:27:02
オリジナル
736 人が閲覧しました

How Can I Efficiently Retrieve Attendees for an Event with Nested Relationships in Laravel?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート