web-dev-qa-db-fra.com

Laravel Où sur un objet de relation

Je développe une API Web avec Laravel 5.0 mais je ne suis pas sûr d'une requête spécifique que je tente de créer.

Mes cours sont les suivants:

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');
    }
}

et

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');
    }
}

Maintenant, je veux obtenir tous les événements avec un participant spécifique. J'ai essayé avec:

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

mais la condition where est appliquée sur le Event et non sur son Partecipants. Ce qui suit me donne une exception:

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

Je sais que je peux écrire ceci:

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

mais il ne semble pas très efficace d'envoyer autant de requêtes au serveur.

Quel est le meilleur moyen d’effectuer une where à travers une relation de modèle en utilisant Laravel 5 et Eloquent?)?

44
Lic

La syntaxe correcte pour effectuer cela sur vos relations est la suivante:

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

Plus d'informations sur https://laravel.com/docs/5.8/eloquent-relationships#eager-loading

P.S. C'est "participant", pas "partecipant".

122
Crembo

La réponse de @ Cermbo n'est pas liée à cette question. dans cette réponse, laravel vous donnera tous les Events si par Event a 'partecipants' avec IdUser est 1.

Mais si vous voulez obtenir tous les Events avec tous les 'partecipants' à condition que par 'partecipants' avec IdUser vaut 1, alors vous devriez faire quelque chose comme ceci:

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

attention à:

dans où utilisez votre nom de table, pas de nom de modèle.

15
Hamid Naghipour