1
votes

Laravel query builder méthode GROUP BY avec les méthodes SKIP et TAKE

J'ai environ 50000 enregistrements et je les montre dans Datatable avec traitement côté serveur. Dans ma requête, j'applique la méthode groupBy () avec les méthodes skip () et take () .

Je veux pouvoir pour appliquer la limite APRÈS groupBy () par exemple

Si la limite est de 10, elle doit renvoyer 10 groupes et non 10 enregistrements.

DB::table('actions')->whereBetween('timestamp', 
array($dates['startDate'], $dates['endDate']))
->where('shop_name', $shopName)
->skip($start)
->take(10)
->get()
->groupBy('product_id');

Avec cette requête, j'obtiens 10 enregistrements et non 10 groupes.


5 commentaires

Mettez votre groupBy () avant votre -> get ()


J'ai essayé alors groupBY () ne fonctionne pas.Il montre 10 enregistrements sans groupes.


Affiche-t-il 10 actions différentes avec 10 identifiants de produit différents? Puisque c'est ce que vous regroupez. Vous DEVEZ mettre votre groupBy () avant votre get ().


oui, il montre 10 actions différentes avec 10 product_id différents.


Ensuite, cela a fonctionné, vous avez 10 groupes différents, parce que vous avez plus de 10+ product_id, vous recevrez 10 enregistrements. Il a fait exactement ce que vous lui avez demandé.


3 Réponses :


0
votes

Essayez d'omettre take (10) et d'ajouter limit (10) à la toute fin de votre requête mais avant get () .

/ p>


1 commentaires

J'ai essayé de ne pas retourner 10 groupes.il retourne 3 groupes avec 10 enregistrements



0
votes

L'ordre de vos instructions de requête est incorrect. Ce qui suit devrait faire l'affaire. Notez que groupBy () est avant votre take () et get () .

Dans votre cas, vous regroupez après que les enregistrements ont été récupérés.

DB::table('actions')
    ->whereBetween('timestamp', array($dates['startDate'], $dates['endDate']))
    ->where('shop_name', $shopName)
    ->groupBy('product_id')
    ->skip($start)
    ->take(10)
    ->get()


6 commentaires

Vous pouvez également utiliser -> limit (10) sur -> take (10) . Take est un alias de limite. C'est la bonne réponse. Bravo


Vous êtes les bienvenus. N'hésitez pas à voter pour / marquer ceci comme la réponse si cela a fonctionné pour vous. Voir Que dois-je faire lorsque quelqu'un répond


@Mozammil quelle est la meilleure méthode d'approche splice () ou les méthodes take and skip?


Il n'y a pas de méthode d'épissure. L'alias de take () est limit () . C'est juste une question de choix personnel. Ils font tous les deux la même chose :)


C'est une méthode d'épissure que j'ai essayée après group by et cela a également fonctionné comme un charme 'splice ($ start, $ rowperpage)'


Splice est une méthode de collecte. Pas un disponible dans le QueryBuilder. Dans ce cas particulier, je préfère utiliser take () ou limit ()



0
votes
DB::table('actions')
            ->whereBetween('timestamp', array($dates['startDate'], $dates['endDate']))
            ->where('shop_name', $shopName)
            ->get()
            ->groupBy('product_id')
            ->splice($start,$rowperpage);
and this order worked.

1 commentaires

Bien que cela fonctionne , vous effectuez les opérations de raccordement après avoir récupéré 50 000 enregistrements. Ce n'est pas un cas idéal du point de vue de la mémoire. J'ai modifié ma réponse pour inclure une instruction offset () . Vous pouvez l'utiliser pour compenser votre requête si vous le souhaitez.