web-dev-qa-db-fra.com

Relation de requête Eloquent

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();
23
Vuk Stanković

N'importe lequel d'entre eux devrait fonctionner pour vous, choisissez celui que vous aimez le plus:

  1. 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.

  2. 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

31
rmobis

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

16
glnemeth

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