2
votes

Grouper en utilisant Eloquent (Laravel)

entrez la description de l'image ici Le problème se produit lorsque j'ajoute group by dans ma requête ...

Form::select('*')->groupBy('serial_num')->orderBy('id')->Paginate(10);

SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 'database.form.id' n'est pas dans GROUP BY (SQL: sélectionnez * dans le groupe form par numéro_série limite 10 offset 0)


4 commentaires

Qu'essayez-vous d'accomplir avec cette requête? Pouvez-vous nous montrer des exemples de données d'entrée et de sortie? La requête que vous avez écrite n'a pas de sens, mais là encore, ce n'est peut-être pas ce que vous avez l'intention de faire.


Avez-vous un modèle nommé Form ?


Oui, j'ai un nom de modèle. Je veux lister tous les enregistrements mais je veux regrouper les enregistrements qui ont le même numéro de série ...


Pouvez-vous montrer la sortie souhaitée?


3 Réponses :


1
votes

Accédez à config \ database.php

Définissez

php artisan optimize

après avoir enregistré, exécutez cette commande

'mysql' => [
    'strict' => false

p>


4 commentaires

J'ai changé strict en faux mais encore une fois le même problème s'est produit, alors j'ai changé strict en vrai


Avez-vous effacé le cache après avoir changé?


Oui j'ai effacé le cache: php artisan config: cache, php artisan cache: clear et aussi je lance php artisan optimiser, mais cela n'a pas fonctionné ...


Merci beaucoup les gars, j'ai vidé le cache et j'ai redémarré mon serveur (xampp et laravel) et le groupe a travaillé ...



2
votes

Ceci n'est pas lié à Laravel. Vous sélectionnez des colonnes non agrégées (*) en combinaison avec le regroupement.

Vous avez deux options ici

  1. utilisez l'agrégation (Min, Max, Avg, Group_concat) sur chaque colonne que vous sélectionnez et non par regroupement
  2. désactiver ONLY_FULL_GROUP_BY sur le serveur MySQL

Explication plus détaillée https://dev.mysql.com/doc/ refman / 5.7 / fr / group-by-handling.html

Modifier: Apparemment, Laravel peut également définir les modes MySQL à la volée.

Comme mentionné dans les commentaires, vous pouvez désactiver le mode strict dans les paramètres de la base de données Laravel, Laravel devrait alors définir le mode serveur MySQL en conséquence, je ne trouve pas de documentation à jour pour cela

https://github.com/laravel/laravel /blob/master/config/database.php#L59

https: // mattstauffer.com/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2/

assurez-vous de vider tout cache de configuration après avoir modifié le paramètre


0 commentaires

1
votes

Si vous pouviez gérer la pagination vous-même, alors vous pourriez obtenir les résultats, puis implémenter groupBy sur la collection.

$forms = Form::orderBy('id')->get()->groupBy(function ($item, $key) {
    return $item['serial_num'];
});


0 commentaires