Laravel 5

Group By et Order

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    245

    Bonjour,

    Pourquoi en faisant cette requête, je ne ressors pas le dernier élément de chaque "category_id" ?

    $posts = Post::orderBy('created_at', 'desc')
    ->groupBy('category_id')
    ->take(4)
    ->get();

    Merci

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

    Salut,

    Pour autant que je sache MySQL traite le GroupBy avant le OrderBy, du coup tu ne peux pas savoir quelle ligne sera choisie. Il faut voir le GroupBy essentiellement pour faire des agrégations. Peut-être que ce qu'il te faut c'est plutôt Distinct.

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    245

    J'ai aussi testé le distinct sans le groupBy mais ça me renvoie tous les élements car il ne sait pas sur quoi "être distinct"

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

    Tu peux appliquer le Distinct sur ta colonne category_id.

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    245

    Peut-être que je l'utilise mal, mais j'ai lu qu'on ne pouvait pas mettre de nom de colonne dans le distinct comme je le teste ici :

    $posts = Post::orderBy('published_at', 'desc')
    ->distinct('category_id')
    ->take(4)
    ->get();
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2632

    Ah oui je viens de vérifier dans le core, distinct n'accepte pas de paramètre... C'est dommage ça...

    Mais tu peux quand même le forcer : selectRaw('DISTINCT category_id')

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    245

    Oui, j'ai testé ton idée qui est quasi top, seulement impossible de joindre les autres colonnes.

    J'ai même tenté de modifer en :

    $posts = Post::select(DB::raw('DISTINCT(category_id)'), 'name')
    ->orderBy('published_at', 'desc')
    ->get();

    Quand on fait ça, on refait apparaitre les autres lignes de la DB :(

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

    S'il y a des valeurs différentes dans certaines colonnes forcément les lignes sont distinctes.

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    245

    Sauf que je veux "distincts" que sur catégory_id

    J'ai 4 catégory_id. Je souhaite juste récupérer le dernier élément de chaque catégorie avec les valeurs associées.

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

    Peut-être avec une sous-requête :

    $posts = Post::whereIn('id', function($q)
    {
    $q->selectRaw('MAX(id)')
    ->from('posts')
    ->groupBy('category_id');
    })
    ->take(4)
    ->get();
  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    245

    Merci, parfait !

Vous ne pouvez pas répondre à ce sujet.