J'ai le modèle News
et News
a beaucoup de commentaires, donc je l'ai fait dans le modèle News
:
public function comments(){
$this->hasMany('Comment', 'news_id');
}
Mais j'ai également le champ trashed
dans la table comments
, et je souhaite uniquement sélectionner les commentaires qui ne sont pas mis à la corbeille. Alors trashed <> 1
. Je me demande donc s'il existe un moyen de faire quelque chose comme ça:
$news = News::find(123);
$news->comments->where('trashed', '<>', 1); //some sort of pseudo-code
Existe-t-il un moyen d'utiliser la méthode ci-dessus ou dois-je simplement écrire quelque chose comme ceci:
$comments = Comment::where('trashed', '<>', 1)
->where('news_id', '=', $news->id)
->get();
N'importe lequel d'entre eux devrait fonctionner pour vous, choisissez celui que vous aimez le plus:
Chargement avide.
$comments = News::find(123)->with(['comments' => function ($query) {
$query->where('trashed', '<>', 1);
}])->get();
Vous pouvez injecter le paramètre pour interroger la fonction par la méthode use($param)
, qui vous permet d'utiliser la valeur de requête dynémique au moment de l'exécution.
Chargement paresseux
$news = News::find(123);
$comments = $news->comments()->where('trashed', '<>', 1)->get();
Je ne pouvais pas m'empêcher de remarquer, cependant, que ce que vous essayez probablement de faire est de gérer la suppression logicielle, et que Laravel a une fonctionnalité intégrée pour vous aider avec cela: http://laravel.com/docs/eloquent#soft-deleting
La réponse de rmobis était ce dont j'avais besoin, mais cela génère une erreur dans le courant Laravel 5. Vous devez utiliser maintenant comme un tableau associatif:
$comments = News::find(123)->with(
['comments' => function ($query) {$query->where('trashed', '<>', 1);}]
);
Cela m'a pris un peu de temps pour le comprendre, j'espère que cela aidera les autres.
En savoir plus dans Laravel's Docs (5.6): https://laravel.com/docs/5.6/eloquent-relationships#querying-relations
Vous pouvez le faire simplement dans votre fichier de modèle éloquent. fait comme ça :
public function comments_with_deleted()
{
return $this->belongsTo('Comments', 'id')->where('deleted', 1);
}
public function comments()
{
return $this->belongsTo('Comments', 'id');
}
appeler comme ça:
// for show comments with deleted
$comments = News::find(123)->with('comments_with_deleted');
// for show comments without deleted
$comments = News::find(123)->with('comments');