Laravel: Syntaxfehler oder Zugriffsverletzung: 1055 Fehler

89

Ich möchte WhereIn und Groupby in derselben Abfrage verwenden, um das Ergebnis abzurufen.

Ich habe das versucht:

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

Aber ich habe diese Fehlermeldung erhalten:

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1055 'sbrtpt.loading.id' befindet sich nicht in GROUP BY (SQL: Wählen Sie * aus dem Laden aus, wobei die ID in der Gruppe (14, 15, 16) nach Fahrzeugnummer lautet).

Karthikvijayaveni
quelle
Wechseln Sie Ihre groupBy- und whereIn-Anweisungen
am
Es funktioniert nicht @aynber
Karthikvijayaveni
Können Sie Ihre vollständige Fehlermeldung ausdrucken?
aynber
SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1055 'sbrtpt.loading.id' ist nicht in GROUP BY (SQL: Wählen Sie * aus, loadingwo idin (14, 15, 16) gruppiert nach vehicle_no) @aynber
Karthikvijayaveni

Antworten:

199

Kurze Antwort

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

Stellen Sie ein 'strict' => false, um alle zu deaktivieren.

.... oder

Sie können die Option in verlassen 'strict' => trueund Modi hinzufügen"mysql"

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

Detaillierte Antwort

Möglicherweise müssen Sie nicht alle strengen Optionen deaktivieren. Bitte lesen Sie diese Antwort zu diesem Problem.

Husam
quelle
2
Vielen Dank für eine tolle Lösung. Diese Ausgabe tötete meine 3 Stunden
Sarower Jahan
Wie können wir diesen strengen Modus bei Orakelverbindung in Laravel auf false setzen? Bitte helfen Sie mir
Vikas Chauhan
@ VikasChauhan, Entschuldigung, ich habe Oracle vorher nicht benutzt
Husam
2
Das hat funktioniert !!! Für alle, die nach dem Ändern dieser Einstellung immer noch den gleichen Fehler erhalten, versuchen Sie, den Konfigurationscache durch Ausführen php artisan config:cache
Altin
Meine Sorge bezüglich dieser Art von hartcodierter Problemumgehung ist, dass ich eine Art technische Verschuldung verspüre, die mich nachts nicht gut schlafen lässt, weil die Art von Fragen, die in meinem Kopf schweben, wie folgt sein wird: Was passiert, wenn Laravel und / oder MySQL-Spezifikation ändert sich in Bezug auf modes(z. B. Hinzufügen / Entfernen einiger der in diesem Array angegebenen Modi, oder noch schlimmer, der Name eines der in diesem Array angegebenen Modi ändert sich). Also gehe ich einfach strict=trueund werde nichts anfassen mode. Ich werde lieber meinen Code aktualisieren, um mit solch strengen Einstellungen zu arbeiten. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere
105

Dies ist wahrscheinlich ein SQL_MODE- Problem. In Ihrer config/database.php, in der Verbindung ändern

strict => false

Wie 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,
],
Antonio Carlos Ribeiro
quelle
1
In dieser Methode kann jedes Sicherheitsproblem @Antonio Carlos Ribeiro
Karthikvijayaveni
Ich glaube, es ist sicher, oder Sie hätten auf Laravel keine Option, es zu deaktivieren.
Antonio Carlos Ribeiro
7

Ohne die Datei config \ database.php zu ändern

Eingestellt'strict' => false in config\database.phpkönnte ein Sicherheitsproblem sein . Eine einfache Laravel-Lösung könnte also zuerst aufgerufen werden get()und danngroupBy('vehicle_no) :

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
cespon
quelle
Ich konnte kein richtiges Ergebnis erzielen, wenn 'strict' => false. Dann funktioniert diese Lösung gut, wenn Sie bei der Abfrage Gruppendaten versuchen. Danke für die Antwort.
Ireshan Pathirana
6

Wenn Sie groupBy in eloquent verwenden, geben Sie immer den in der groupBy-Funktion verwendeten Spaltennamen in die select () -Funktion ein.

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

Es ist auch eine schlechte Praxis, den strengen Modus in der Konfigurationsdatei zu deaktivieren. Dies kann dazu führen, dass beschädigte Daten in die Datenbank gelangen, z. B. ungültige Daten ohne Warnungen. Tun Sie dies nur, wenn dies unbedingt erforderlich ist.

Thungdemo
quelle
Das Hinzufügen von -> select ('column') hat bei mir funktioniert. Danke Kumpel :)
Shaan
5

Ich hatte dieses Problem auch, aber nach dem Ändern 'strict' => trueauf 'strict' => falseverschwand der Fehler.

Sie finden diese Einstellung in:

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
Zakhele
quelle
Wie können wir das für Orakelverbindung in Laravel tun
Vikas Chauhan
3

aktualisieren config/database.php

einstellen:

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

anstatt:

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

und vergessen Sie nicht, den Cache zu leeren:

php artisan config:cache
Gouda Elalfy
quelle
Abgesehen davon, dass ich 2016 geantwortet habe, wenn ich dich tausendmal wählen kann, werde ich es tun. Schlagen Sie ungefähr 24 Stunden damit, ohne eine Ahnung zu haben, dass es zwischengespeichert wird. Ich liebe dich Mann <3
Faisal Mehmood Awan
2

Diese Einschränkung ist sinnvoll, da bei Verwendung GROUP BYin MySQL für jeden Wert in den in verwendeten Spalten eine Zeile zurückgegeben wird GROUP BY. Daher ist es nicht sinnvoll, die Werte anderer Spalten in den ausgewählten Zeilen irgendwo zu verwenden. Es wird daher immer empfohlen, die Best Practice zu verwenden, und ich würde empfehlen, den MySQL Strict-Modus nicht zu deaktivieren.

Oft benötigen Entwickler Zeilen einer Abfrage, die nach dem Wert einer Spalte gruppiert sind. Hier benötigen sie nicht nur eine Zeile pro den eindeutigen Werten der Spalten. Sie benötigen jedoch mehrere Zeilen, die nach den eindeutigen Werten einer bestimmten Spalte gruppiert sind. Aus irgendeinem Grund verwenden sie die groupByQuery Builder-Methode von Laravel, die ein MySQL generiertGROUP BY Abfrage und die Entwickler stoßen auf den obigen Fehler.

Die Lösung für ihr Problem besteht darin groupBy, stattdessen die Erfassungsmethode zu verwenden. Zum Beispiel,

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

Dies gibt ihnen das gewünschte Ergebnis.

Debiprasad
quelle
0

\Schema::defaultStringLength(191);zur bootMethode hinzufügen

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);
    }
}
hamed hossani
quelle
0

Sie können genauso gut verwenden:

deutlich ('Fahrzeug_No')

Anstelle von groupBy ('Vehicle_no') ist jedes Szenario anders, aber wenn Sie sich Ihre Abfrage ansehen, ist möglicherweise ein anderes Szenario der richtige Weg, da Sie keine Daten aggregieren.

ben.c
quelle