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?)?
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".
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.