Bonjour à tous.
Sur mon application, j'ai un système de commentaires. Cependant j'ai un léger soucis, j'ai une requête SQL qui s'effectue en trop, et en boucle :
http://hpics.li/7474eb5

Actuellement elle s'effectue 9 fois, c'est le nombre de commentaires que j'ai dans ma page.
Le soucis, c'est que je ne sais pas du tout où se fait cette requête SQL, j'ai fouillé mes models et mes controlleurs, je n'ai rien trouvé.
Du coup le controlleur concerné c'est ce code là :

public function show($id)
    {
        $jeux = Produit::whereId($id)->first();
        $stock = Produit::where('categorie_id', $jeux->categorie_id)->count();

        $comments = Comment::with('children')->commentsFor($jeux)->paginate(5);

        return view('produit.show', compact('jeux', 'stock', 'comments'));
    }

Et ma vue avec l'affichage des commentaires :

@foreach($comments as $comment)
    <div class="co col-md-12">
        <div class="col-md-5">
                <img class="imguser" src="{{url("public{$comment->user->avatar}") }}">
        </div>
        <div class="col-md-5">
            <p><strong>{{$comment->pseudo}}</strong></p>
        </div>
            <div class="commentaire">
                {{$comment->content}}
            </div>
        </div>
        @include('comments.replies')
    </div>
@endforeach

Si vous avez besoin de mes requêtes liés au models dites le, je n'ai pas jugé utile de les mettre puisqu'aucune d'elles n'ont un user dans leurs requêtes SQL.

Du coup, que devrais-je faire pour avoir des requêtes plus propres, et surtout, moins nombreuses ?

Je vous remercie :)

4 réponses


Azorgh
Réponse acceptée

Salut !

La relation "Children" reste bien un commentaire ? Dans ce cas, tu peux faire

$comments = Comment::with(['children.user', 'user'])->commentsFor($jeux)->paginate(5);

Tu va ainsi récupérer les utilisateurs des réponses sans requêtes supplémentaires.

Salut,

En effet, dans ta boucle, tu va récupérer l'avatar de l'utilisateur. Or, tu n'a pas inclus ce model dans un with ! Donc pour chaque Comment, il va récupérer l'utilisateur.

Fait donc :

$comments = Comment::with(['children', 'user'])->commentsFor($jeux)->paginate(5);

Et là ca devrait aller !

Bonjour,
J'ai essayé de faire comme ça, du coup il m'a rajouté une requête SQL, avec un in, ce qui me parrait bon, mais n'a pas supprimé les autres requêtes.
Après, j'ai un lien belongsTo avec mon model User, est-ce que ce serait ça qui fait déconner mes requêtes ?

EDIT : J'ai mal vu, les requêtes liées aux commentaires sont OK, il y en a qu'une, mais celles liées aux réponses déconnent encore.

Le code de la vue des réponses est identique au code mis plus haut, sauf que mon foreach est un

@foreach($comment->children as $rep)

et que du coup j'appelle $rep pour récupérer mes données.

C'est parfait, j'avais pas pensé à rajouter le .user après mon children. Merci beaucoup ! :)