Comment puis-je résoudre incompatible avec sql_mode=only_full_group_by dans laravel éloquent?
Mon laravel éloquent est comme ceci :
$products = Product::where('status', 1)
->where('stock', '>', 0)
->where('category_id', '=', $category_id)
->groupBy('store_id')
->orderBy('updated_at', 'desc')
->take(4)
->get();
Lorsqu'il est exécuté, il existe d'erreur comme ceci :
SQLSTATE[42000]: erreur de Syntaxe ou de violation d'accès: 1055 Expression #1
de la liste de sélection n'est pas dans la clause GROUP BY et contient nonaggregated
la colonne " myshop.produits.id " qui n'est pas fonctionnellement dépendante
les colonnes dans la clause GROUP BY; ce qui est incompatible avec
sql_mode=only_full_group_by (SQL: select * fromproducts
où
status
= 1 etstock
> 0 etcategory_id
= 5 groupe parstore_id
commande parupdated_at
desc limit 4)
Comment puis-je le résoudre?
OriginalL'auteur samuel toh | 2017-05-04
Vous devez vous connecter pour publier un commentaire.
J'ai eu un Problème similaire et résolu par la désactivation de mysql en mode strict dans la base de données de paramètre de connexion.
Vous pouvez trouver encore plus de paramètres de configuration dans ce post de blog de Matt Stauffer
après une journée gaspillée venir ici et cela a résolu mon problème
je vous remercie, vous avez probablement m'a sauvé la journée à essayer de comprendre cela. Question: est il n'y a aucun inconvénient à ne pas utiliser strictes ici? Un autre commentaire a mentionné le bug de sécurité. Dans mon cas, SQL brut a été de travail, mais lorsque je suis passé par Laravel (générateur de Requête, 5.6) j'ai eu la "seuls du groupe" erreur.
merci beaucoup
OriginalL'auteur naabster
Dans le dossier config => database.php assurez-vous que mysql stricte est faux, à l'instar de ce
si strict est vrai, faire de faux, puis d'effacer config de trésorerie par exécutez cette commande dans le cmd
OriginalL'auteur AnasSafi
C'est parce que les dernières versions de MySQL de se comporter comme la plupart des sgbd déjà faire en matière d'
group by
clauses; la règle générale estVotre requête de regroupement par
store_id
, mais puisque vous êtes à la sélection de tout ce que la règle ci-dessus n'est pas respectée.select * from products where status = 1 and stock > 0 and category_id = 5 group by store_id order by updated_at desc limit 4
dans mysql, il fonctionne. Il semble que l'erreur est donc via éloquent laravelOriginalL'auteur Stefano Zanini
Dans le .env fichier AJOUTER une variable:
DB_STRICT=false
.Et de les REMPLACER dans le fichier à partir de l'emplacement: config/database.php, suivant les codes
'strict' => true
SUR'strict' => (env('DB_STRICT', 'true') === 'true' ? true : false)
.bonne chance.
OriginalL'auteur amiron
J'ai résolu ce problème en ajoutant les "modes" et paramétrer les modes de je veux être activé dans config => database.php
Voir plus de détails dans ce tutoriel
OriginalL'auteur O.Tadj
Alors appel set_sql_mode("); juste avant éloquent/requête
OriginalL'auteur Godfrey Makori
ensemble
'strict' => false
dans votre config/database.php fichier. Dans la gamme
connections => mysql =>
dans mon cas, je suis de l'utilisation de mysql 5.7
Laravel 5.7
OriginalL'auteur Akbar Mirsidikov
Vérifier la requête:
ici, vous êtes le regroupement des données par
store_id
et la récupération de toutes les colonnes dans le jeu de résultats qui n'est pas autorisé. Pour le résoudre, soit sélectionnerstore_id
ou de la fonction d'agrégation ou de modifier la variable systèmesql_mode=only_full_group_by
àSET sql_mode = ''
.Référence
select * from products where status = 1 and stock > 0 and category_id = 5 group by store_id order by updated_at desc limit 4
dans mysql, il fonctionne. Il semble que l'erreur est donc via éloquent laravelcomment mettre en mode sql dans laravel?
OriginalL'auteur Mayank Pandeyz
Pour sélectionner seuls des colonnes, utilisez l'une des premières méthodes fournies par Laravel. Par exemple:
OriginalL'auteur Yvan