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
を実行する最良の方法は何ですか?
リレーションでこれを行う正しい構文は次のとおりです。
Event::whereHas('partecipants', function ($query) {
$query->where('IDUser', '=', 1);
})->get();
詳しくは https://laravel.com/docs/5.8/eloquent-relationships#eager-loading をご覧ください
追伸「参加者」ではなく「参加者」です。
@Cermboの答えは、この質問とは関係ありません。この回答では、laravel
は、Events
が'partecipants'
でEvent
が1
である場合、すべてのIdUser
を提供します。
ただし、Events
が1である場合、'partecipants'
が1である場合、すべてのIdUser
をすべて'partecipants'
で取得する場合は、次のようにする必要があります。
Event::with(["partecipants" => function($q){
$q->where('partecipants.IdUser', '=', 1);
}])
への注意:
モデル名ではなく、テーブル名を使用する場所。