Laravel: errore di sintassi o violazione di accesso: errore 1055


93

Voglio usare WhereIn e Groupby nella stessa query per recuperare il risultato.

Ho provato questo:

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

Ma ho ricevuto questo messaggio di errore:

SQLSTATE [42000]: errore di sintassi o violazione di accesso: 1055 'sbrtpt.loading.id' non è in GROUP BY (SQL: seleziona * dal caricamento dove id in (14, 15, 16) group by vehicle_no)


Cambia il tuo gruppoBy e whereIn dichiarazioni in giro
aynber

Non funziona @aynber
Karthikvijayaveni

Puoi stampare il tuo messaggio di errore completo?
aynber

SQLSTATE [42000]: errore di sintassi o violazione di accesso: 1055 'sbrtpt.loading.id' non è in GROUP BY (SQL: seleziona * da loadingdove idin (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

Risposte:


212

Risposta breve

In config\database.php-> "mysql"array

Impostare 'strict' => falseper disabilitare tutto.

.... o

Puoi lasciare 'strict' => truee aggiungere modalità "mysql"all'opzione in

'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'
        ],
 ]

Risposta dettagliata

Potrebbe non essere necessario disabilitare tutte le opzioni rigorose ... Si prega di dare un'occhiata a questa risposta su questo problema.


2
Grazie per l'ottima soluzione. questo problema ha ucciso le mie 3 ore
Sarower Jahan

Come possiamo impostare questa modalità rigorosa su false sulla connessione Oracle in laravel? Per favore aiutami
Vikas Chauhan

@VikasChauhan, Scusa se non ho usato Oracle prima
Husam

3
Questo ha funzionato !!! Per chiunque riceva ancora lo stesso errore dopo aver modificato tale impostazione, prova a svuotare la cache di configurazione eseguendophp artisan config:cache
Altin

La mia preoccupazione per questo tipo di soluzione alternativa hardcoded è che sento un qualche tipo di debito tecnico che non mi farà dormire bene la notte, perché il tipo di domande che mi fluttueranno nella testa sarà: cosa succede quando / o le specifiche di MySQL cambiano rispetto a modes(es. aggiunta / rimozione di alcune delle modalità specificate in quell'array, o peggio ancora, cambia il nome di una delle modalità specificate in quell'array). Quindi, me ne vado strict=truee non toccherò modeniente. Preferisco aggiornare il mio codice per lavorare con impostazioni così rigide. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

106

Questo è probabilmente un problema SQL_MODE . Nel tuo config/database.php, nella connessione, il cambiamento

strict => false

Come in

'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,
],

1
In questo metodo puoi fare qualsiasi problema di sicurezza @Antonio Carlos Ribeiro
Karthikvijayaveni

Credo che sia sicuro o non avresti un'opzione su Laravel per disabilitarlo.
Antonio Carlos Ribeiro

10

Senza modificare il file config \ database.php

Situato'strict' => false nella config\database.phppotrebbe essere un problema di sicurezza . Quindi, una semplice soluzione Laravel potrebbe essere la prima chiamata get()e poigroupBy('vehicle_no) :

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

Non sono riuscito a ottenere un risultato corretto quando 'strict' => false. allora questa soluzione funziona bene se provi a raggruppare i dati durante la query. Grazie per la risposta.
ireshan pathirana

6

Ogni volta che si utilizza groupBy in eloquente, includere sempre il nome della colonna utilizzato nella funzione groupBy nella funzione select ().

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

Inoltre è una cattiva pratica disabilitare la modalità rigorosa nel file di configurazione. Ciò potrebbe causare l'ingresso di dati danneggiati nel database come date non valide senza alcun avviso. Non farlo a meno che non sia assolutamente necessario.


L'aggiunta di -> seleziona ('colonna') ha funzionato per me. Grazie amico :)
Shaan

5

Ho avuto questo problema anche dopo aver cambiato ma 'strict' => true, per 'strict' => false, l'errore è scomparso.

Puoi trovare questa impostazione in:

config \ database.php

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

Come possiamo farlo per la connessione oracolare in laravel
Vikas Chauhan

3

Questa restrizione ha senso poiché quando si utilizza GROUP BYin MySQL, restituisce una riga per ogni valore nelle colonne utilizzate in GROUP BY. Quindi, i valori di altre colonne nelle righe selezionate non hanno senso da usare ovunque. Quindi, è sempre consigliabile utilizzare le migliori pratiche e consiglierei di non disabilitare MySQL Strict Mode.

Spesso gli sviluppatori potrebbero aver bisogno di righe di una query raggruppate per il valore di una colonna. Qui non è necessaria solo una riga per i valori univoci delle colonne. Ma hanno bisogno di più righe raggruppate in base ai valori univoci di una particolare colonna. Per qualche motivo, usano il groupBymetodo Query Builder di Laravel che genera una GROUP BYquery MySQL e gli sviluppatori riscontrano l'errore precedente.

La soluzione al loro problema è utilizzare groupByinvece il metodo Collection. Per esempio,

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

Questo darà loro il risultato desiderato.


3

aggiornare config/database.php

impostato:

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

invece di:

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

e non dimenticare di svuotare la cache:

php artisan config:cache

oltre a ricevere una risposta nel 2016, se posso votarti mille volte lo farò. battere con esso per circa 24 ore senza alcun indizio che venga memorizzato nella cache. Ti amo uomo <3
Faisal Mehmood Awan

0

Potresti anche usare:

distinto ('veicolo_no')

invece di groupBy ('vehicle_no') ogni scenario è diverso, ma guardando la tua query, distinta potrebbe essere la strada da percorrere poiché non stai aggregando i dati.


-1

aggiungi \Schema::defaultStringLength(191);al bootmetodo

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);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.