web-dev-qa-db-ja.com

Laravel where関係オブジェクト

Laravel 5.0を使用してWeb APIを開発していますが、ビルドしようとしている特定のクエリについてはわかりません。

私のクラスは次のとおりです。

class Event extends Model {

    protected $table = 'events';
    public $timestamps = false;

    public function partecipants()
    {
        return $this->hasMany('App\Partecipant', 'IDEvent', 'ID');
    }

    public function owner()
    {
        return $this->hasOne('App\User', 'ID', 'IDOwner');
    }
}

そして

class Partecipant extends Model {

    protected $table = 'partecipants';
    public $timestamps = false;

    public function user()
    {
        return $this->belongTo('App\User', 'IDUser', 'ID');
    }

    public function event()
    {
        return $this->belongTo('App\Event', 'IDEvent', 'ID');
    }
}

次に、特定の参加者とのすべてのイベントを取得します。私が試した:

Event::with('partecipants')->where('IDUser', 1)->get();

ただし、where条件はEventではなくPartecipantsに適用されます。以下は例外です。

Partecipant::where('IDUser', 1)->event()->get();

私はこれを書くことができることを知っています:

$list = Partecipant::where('IDUser', 1)->get();
for($item in $list) {
   $event = $item->event;
   // ... other code ...
}

しかし、非常に多くのクエリをサーバーに送信することはあまり効率的ではないようです。

Laravel 5とEloquentを使用して、モデル関係を通じてwhereを実行する最良の方法は何ですか?

44
Lic

リレーションでこれを行う正しい構文は次のとおりです。

Event::whereHas('partecipants', function ($query) {
    $query->where('IDUser', '=', 1);
})->get();

詳しくは https://laravel.com/docs/5.8/eloquent-relationships#eager-loading をご覧ください

追伸「参加者」ではなく「参加者」です。

122
Crembo

@Cermboの答えは、この質問とは関係ありません。この回答では、laravelは、Events'partecipants'Event1である場合、すべてのIdUserを提供します。

ただし、Eventsが1である場合、'partecipants'が1である場合、すべてのIdUserをすべて'partecipants'で取得する場合は、次のようにする必要があります。

Event::with(["partecipants" => function($q){
    $q->where('partecipants.IdUser', '=', 1);
}])

への注意:

モデル名ではなく、テーブル名を使用する場所。

15
Hamid Naghipour