170 votes

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

Je veux utiliser WhereIn et Groupby dans la même requête 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)

389voto

Husam Points 1964

Réponse courte

En config\database.php --> "mysql" tableau

Ensemble 'strict' => false de désactiver tous.

.... ou

Vous pouvez quitter 'strict' => true et ajouter des modes d' "mysql" option

'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 ne pouvez pas besoin de désactiver tous stricte options ... Veuillez jetez un oeil sur cette réponse sur cette question.

129voto

C'est probablement un problème SQL_MODE . 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,
],
 

16voto

cespon Points 3360

Sans modifier le fichier config \ database.php

Définir 'strict' => false dans les config\database.php pourrait être un problème de sécurité . Ainsi, une solution simple de Laravel pourrait être le 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');
 

8voto

Zakhele Points 41

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

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

l'erreur disparaît.

8voto

Thungdemo Points 11

Lorsque vous utilisez groupBy dans éloquent, incluez toujours le nom de colonne utilisé 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X