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).
loading
woid
in (14, 15, 16) gruppiert nachvehicle_no
) @aynberAntworten:
Kurze Antwort
In
config\database.php
->"mysql"
ArrayStellen Sie ein
'strict' => false
, um alle zu deaktivieren..... oder
Sie können die Option in verlassen
'strict' => true
und 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.
quelle
php artisan config:cache
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 einfachstrict=true
und werde nichts anfassenmode
. Ich werde lieber meinen Code aktualisieren, um mit solch strengen Einstellungen zu arbeiten.ThisPractice === SleepWellEveryNight
:)Dies ist wahrscheinlich ein SQL_MODE- Problem. In Ihrer
config/database.php
, in der Verbindung ändernstrict => 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, ],
quelle
Ohne die Datei config \ database.php zu ändern
Eingestellt
'strict' => false
inconfig\database.php
könnte ein Sicherheitsproblem sein . Eine einfache Laravel-Lösung könnte also zuerst aufgerufen werdenget()
und danngroupBy('vehicle_no)
:$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');
quelle
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.
quelle
Ich hatte dieses Problem auch, aber nach dem Ändern
'strict' => true
auf'strict' => false
verschwand der Fehler.Sie finden diese Einstellung in:
config \ database.php
'mysql' => [ ... 'strict' => false, ... ]
quelle
aktualisieren
config/database.php
einstellen:
'mysql' => [ 'strict' => false, ],
anstatt:
'mysql' => [ 'strict' => true, ],
und vergessen Sie nicht, den Cache zu leeren:
quelle
Diese Einschränkung ist sinnvoll, da bei Verwendung
GROUP BY
in MySQL für jeden Wert in den in verwendeten Spalten eine Zeile zurückgegeben wirdGROUP 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
groupBy
Query 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.
quelle
\Schema::defaultStringLength(191);
zurboot
Methode hinzufügenclass AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // \Schema::defaultStringLength(191); } }
quelle
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.
quelle