Mon laravel éloquent est comme ça:
$products = Product::where('status', 1)
->where('stock', '>', 0)
->where('category_id', '=', $category_id)
->groupBy('store_id')
->orderBy('updated_at', 'desc')
->take(4)
->get();
Une fois exécuté, il existe une erreur comme celle-ci:
SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 Expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient non agrégé la colonne 'myshop.products.id' qui ne dépend pas fonctionnellement de colonnes dans la clause GROUP BY; c'est incompatible avec sql_mode = only_full_group_by (SQL: sélectionnez * de
products
oùstatus
= 1 etstock
> 0 etcategory_id
= 5 groupe parstore_id
ordre parupdated_at
limite inférieure 4)
Comment puis-je le résoudre?
J'ai eu un problème similaire et je l'ai résolu en désactivant le mode strict mysql dans le paramètre de connexion à la base de données.
'connections' => [
'mysql' => [
// Behave like MySQL 5.6
'strict' => false,
// Behave like MySQL 5.7
'strict' => true,
]
]
Vous pouvez trouver encore plus de paramètres de configuration dans cet article de Matt Stauffer
En effet, les dernières versions de MySQL se comportent comme la plupart des dbms le font déjà concernant les clauses group by
; la règle générale est
si vous utilisez
group by
, toutes les colonnes de votreselect
doivent être présentes dans legroup by
ou agrégées par une fonction d'agrégation (sum
,count
,avg
et ainsi de suite)
Votre requête actuelle est groupée par store_id
, mais comme vous sélectionnez tout, la règle ci-dessus n'est pas respectée.
Dans le fichier .env, variable ADD: DB_STRICT=false
.
Et REPLACE dans le fichier à partir de l'emplacement: config/database.php, codes suivants 'strict' => true
ON 'strict' => (env('DB_STRICT', 'true') === 'true' ? true : false)
.
bonne chance.
Dans le dossier config => database.php , assurez-vous que mysql strict estfalse, comme ceci
'mysql' => [
'driver' => 'mysql',
'Host' => env('DB_Host', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
si strict est true, indiquez false, puis effacez l'argent de la configuration en exécutant cette commande dans cmd
php artisan config: effacer
J'ai résolu ce problème en ajoutant l'option "modes" et en définissant uniquement les modes que je souhaite activer dans config => database.php
'mysql' => [
...
'modes' => [
'STRICT_ALL_TABLES',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_ZERO_DATE',
'NO_ZERO_IN_DATE',
'NO_AUTO_CREATE_USER',
],
],
Voir plus de détails dans ce tutoriel
Vérifiez la requête:
Product::where('status', 1)
->where('stock', '>', 0)
->where('category_id', '=', $category_id)
->groupBy('store_id')
->orderBy('updated_at', 'desc')
->take(4)
->get();
ici, vous regroupez les données par store_id
et récupérez toutes les colonnes du jeu de résultats qui ne sont pas autorisées. Pour le résoudre, sélectionnez store_id
ou une fonction d'agrégation dessus ou modifiez la variable système sql_mode=only_full_group_by
en SET sql_mode = ''
.