web-dev-qa-db-fra.com

Laravel: Erreur de syntaxe ou violation d'accès: Erreur 1055

Je veux utiliser WhereIn et Groupby dans Same Query pour récupérer le résultat.

J'ai essayé ceci:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();

Mais j'ai eu ce message d'erreur:

SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 'sbrtpt.loading.id' n'est pas dans GROUP BY (SQL: select * from loading où id dans (14, 15, 16), groupe par no_véhicule)

32
Karthikvijayaveni

Réponse courte

Dans le tableau config\database.php -> "mysql"

Définissez 'strict' => false pour tout désactiver.

.... ou

Vous pouvez laisser 'strict' => true et ajouter des modes à l'option "mysql" dans 

'mysql' => [
       ...
       ....
       'strict' => true,
       'modes' => [
            //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_AUTO_CREATE_USER',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]

Réponse détaillée

Vous n’avez peut-être pas besoin de désactiver toutes les options strict ... Veuillez jeter un oeil sur cette réponse à propos de ce problème.

58
Husam

C'est probablement un SQL_MODE problem. Dans votre config/database.php, dans la connexion, changez

strict => false

Un péché 

'mysql' => [
    'driver' => 'mysql',
    'Host' => env('DB_Host', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],
93

J'avais ce problème aussi mais après avoir changé 'strict' => true, en 'strict' => false.
Dans:

[config\database.php -> tableau "mysql"]

l'erreur disparaît.

4
Zakhele

Lorsque vous utilisez groupBy dans éloquent, incluez toujours le nom de la colonne utilisée dans la fonction groupBy dans la fonction select ().

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')

En outre, il est déconseillé de désactiver le mode strict dans le fichier de configuration. Cela pourrait entraîner la saisie de données corrompues dans la base de données, telles que des dates non valides, sans aucun avertissement. Ne le faites que si cela est absolument nécessaire.

1
Thungdemo

Sans modifier le fichier config\database.php

Set 'strict' => false dans config\database.php pourrait être un problème de sécurité. Donc, une solution simple de Laravel pourrait être premier appel get() puis groupBy('vehicle_no):

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
0
cespon