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

89

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 where id in (14, 15, 16) group by vehicle_no)

Karthikvijayaveni
la source
Basculer votre groupeBy et whereIn déclarations autour
aynber
Its Not working @aynber
Karthikvijayaveni
Pouvez-vous imprimer votre message d'erreur complet?
aynber
SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 'sbrtpt.loading.id' n'est pas dans GROUP BY (SQL: sélectionnez * d' loadingiddans (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

Réponses:

199

Réponse courte

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

Réglez 'strict' => falsepour tout désactiver.

.... ou

Vous pouvez quitter 'strict' => trueet ajouter des modes à l' "mysql"option 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'aurez peut-être pas besoin de désactiver toutes les options strictes ... Veuillez consulter cette réponse à ce problème.

Husam
la source
2
Merci pour une excellente solution. ce problème a tué mes 3 heures
Sarower Jahan
Comment pouvons-nous définir ce mode strict sur false sur la connexion oracle dans laravel? Aidez-moi s'il vous plaît
Vikas Chauhan
@VikasChauhan, Désolé je n'ai pas utilisé Oracle auparavant
Husam
2
Cela a fonctionné !!! Pour toute personne qui obtient toujours la même erreur après avoir modifié ce paramètre, essayez de vider le cache de configuration en exécutantphp artisan config:cache
Altin
Ma préoccupation à propos de ce genre de solution de contournement codée en dur est que je ressens une sorte de dette technique qui ne me fera pas bien dormir la nuit, car le genre de questions qui flottent dans ma tête sera comme: que se passe-t-il quand Laravel et / ou les spécifications de MySQL changent par rapport au modes(par exemple, l'ajout / la suppression de certains des modes spécifiés dans ce tableau, ou pire encore, le nom de l'un des modes spécifiés dans ce tableau change). Alors, je pars strict=trueet je ne toucherai à moderien. Je vais plutôt mettre à jour mon code pour travailler avec un paramètre aussi strict. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere le
105

Il s'agit probablement d'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,
],
Antonio Carlos Ribeiro
la source
1
Dans cette méthode peut faire n'importe quel problème de sécurité @Antonio Carlos Ribeiro
Karthikvijayaveni
Je pense que c'est sûr ou vous n'auriez pas d'option sur Laravel pour le désactiver.
Antonio Carlos Ribeiro
7

Sans modifier le fichier config \ database.php

Définir'strict' => false dans le config\database.phppourrait être un problème de sécurité . Ainsi, une solution Laravel simple pourrait être d' abord appelée get(), puisgroupBy('vehicle_no) :

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
cespon
la source
Je n'ai pas pu obtenir de résultat correct lorsque 'strict' => false. alors cette solution fonctionne bien si vous essayez des données de groupe lors de la requête. Merci pour la réponse.
ireshan pathirana
6

Chaque fois que vous utilisez groupBy de manière éloquente, 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')

Désactiver le mode strict dans le fichier de configuration est également une mauvaise pratique. Cela pourrait entraîner l'entrée de données corrompues dans la base de données, telles que des dates non valides, sans avertissement. Ne le faites pas sauf si c'est absolument nécessaire.

Thungdemo
la source
L'ajout de -> select ('colonne') a fonctionné pour moi. Merci mon pote :)
Shaan
5

Je faisais ce problème aussi , mais après avoir changé 'strict' => true, pour 'strict' => false, l'erreur a disparu.

Vous pouvez trouver ce paramètre dans:

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
Zakhele
la source
Comment pouvons-nous faire cela pour la connexion oracle à Laravel
Vikas Chauhan
3

mise à jour config/database.php

ensemble:

'mysql' => [
           'strict' => false,
        ],

au lieu de:

'mysql' => [
           'strict' => true,
        ],

et n'oubliez pas de vider le cache:

php artisan config:cache
Gouda Elalfy
la source
à côté d'être répondu en 2016 si je peux voter mille fois je le ferai. frapper avec lui environ 24 heures sans aucun indice qu'il soit mis en cache. Love you man <3
Faisal Mehmood Awan
2

Cette restriction a du sens car lorsque vous l'utilisez GROUP BYdans MySQL, elle renvoie une ligne pour chaque valeur des colonnes utilisées dans GROUP BY. Ainsi, les valeurs des autres colonnes des lignes sélectionnées n'ont aucun sens à utiliser n'importe où. Il est donc toujours recommandé d'utiliser les meilleures pratiques et je recommanderais de ne pas désactiver le mode MySQL Strict.

Les développeurs peuvent souvent avoir besoin de lignes d'une requête regroupées par la valeur d'une colonne. Ici, ils n'ont pas besoin d'une seule ligne pour les valeurs uniques des colonnes. Mais ils ont besoin de plusieurs lignes regroupées par les valeurs uniques d'une colonne particulière. Pour une raison quelconque, ils utilisent la groupByméthode Query Builder de Laravel qui génère une GROUP BYrequête MySQL et les développeurs rencontrent l'erreur ci-dessus.

La solution à leur problème consiste à utiliser la groupByméthode Collection à la place. Par exemple,

$loadingData = DB::table('loading')
    ->whereIn('id', $loadIds)
    ->get()
    ->groupBy('vehicle_no');

Cela leur donnera le résultat souhaité.

Debiprasad
la source
0

ajouter \Schema::defaultStringLength(191);à la bootméthode

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         \Schema::defaultStringLength(191);
    }
}
jambon hossani
la source
0

Vous pouvez aussi bien utiliser:

distinct ('vehicule_no')

au lieu de groupBy ('vehicle_no'), chaque scénario de cas est différent, mais en regardant votre requête, distinct pourrait être la voie à suivre puisque vous n'agrégez pas les données.

ben.c
la source