web-dev-qa-db-fra.com

Comment puis-je résoudre incompatibles avec sql_mode = only_full_group_by dans laravel éloquent?

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 productsstatus = 1 et stock> 0 et category_id = 5 groupe par store_id ordre par updated_at limite inférieure 4)

Comment puis-je le résoudre?

6
samuel toh

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

25
naabster

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 votre select doivent être présentes dans le group 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.

4
Stefano Zanini

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. 

4
amiron

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

3
AnasSafi

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

1
O.Tadj

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 = ''.

Référence

0
Mayank Pandeyz