Laravel 5

Eloquent Average à partir d'une relation (Système de notes)

  • Avatar de Flegate
    Membre depuis :
    11/01/2019
    Messages :
    3

    Bonjour,

    Je souhaiterais faire un where sur la moyenne des valeurs d'une table ayant une relation avec mon model principal.

    Exemple :

    Model = Movie
    Relation = Rating

    Je souhaites afficher les "Movies" ayant une note moyenne de 4 ou plus (en prenant en compte toutes les notes de "Rating")
    J'ai du mal à trouver comment faire et je bloque un peu, pouvez-vous me venir en aide ?

    Si vous avez besoin de plus d'informations n'hésitez pas à me demander.
    Version de Laravel : 5.6

    Merci d'avance :)

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Salut,

    Je ne pense pas qu'on puisse y arriver avec Eloquent, je me pencherais plutôt sur une traduction en Query Builder d'une requête classique dans ce genre :

    $movies = DB::table('movies')
    ->join('ratings', 'movies.id', '=', 'ratings.movie_id')
    ->select(*)
    ->groupBy('moviename')
    ->havingRaw('AVG(notes) > 4')
    ->get();
  • Avatar de Flegate
    Membre depuis :
    11/01/2019
    Messages :
    3

    Merci pour cette réponse,

    J'ai déjà plusieurs filtres qui sont gérés par Eloquent.
    C'est pour cela que je souhaitais passer par Eloquent.

    J'ai trouvé la solution en conservant l'utilisation du model et donc de la pagination.

    $ratings = DB::table('ratings')->select('movie_id', DB::raw('ceil(avg(ratings.value)) as note'))->groupBy('movie_id');

    $movies = $movies->with('ratings')->joinSub($ratings, 'note', function ($query) {
    $query->on('movies.movie_id', '=', 'note.movie_id');
    })->where('note', '>=', $note);

    En espérant que cela puisse servir à quelqu'un.

    Merci quand même pour le message bestmomo :)

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Ah oui je pense jamais à la sous-requête, je note ;)

  • Avatar de LaurentMARLIN
    Membre depuis :
    20/10/2014
    Messages :
    3

    Salut :)

    $movies = App\Movie::wheraHas('rating', function($rating) {

    $rating->where('rate','>=',4);
    }->get();

    ...

Vous ne pouvez pas répondre à ce sujet.