Chcę użyć WhereIn i Groupby w tym samym zapytaniu, aby pobrać wynik.
Próbowałem tego:
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();
Ale dostałem ten komunikat o błędzie:
SQLSTATE [42000]: Błąd składni lub naruszenie zasad dostępu: 1055 „sbrtpt.loading.id” nie znajduje się w GROUP BY (SQL: wybierz * z ładowania, gdzie identyfikator w (14, 15, 16) grupa według numeru pojazdu)
loading
skądid
w (14, 15, 16vehicle_no
) grupuj według ) @aynberOdpowiedzi:
Krótka odpowiedź
W
config\database.php
->"mysql"
tablicyUstaw,
'strict' => false
aby wyłączyć wszystkie..... lub
Możesz opuścić
'strict' => true
i dodać tryby do"mysql"
opcji'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' ], ]
Szczegółowa odpowiedź
Może nie być konieczne wyłączanie wszystkich ścisłych opcji ... Prosimy spojrzeć na tę odpowiedź dotyczącą tego problemu.
źródło
php artisan config:cache
modes
(np. dodanie / usunięcie niektórych trybów określonych w tej tablicy lub, co gorsza, zmienia się nazwa jednego z trybów określonych w tej tablicy). Więc po prostu wychodzęstrict=true
i niczego niemode
ruszam. Raczej zaktualizuję mój kod, aby działał z tak ścisłym ustawieniem.ThisPractice === SleepWellEveryNight
:)Jest to prawdopodobnie problem SQL_MODE . W twoim
config/database.php
, w połączeniu, zmieństrict => false
Jak w
'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, ],
źródło
Bez modyfikowania pliku config \ database.php
Ustawiony
'strict' => false
wconfig\database.php
może być kwestią bezpieczeństwa . Tak więc proste rozwiązanie Laravel może być najpierwget()
groupBy('vehicle_no)
wywołane, a następnie :$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');
źródło
Za każdym razem, gdy używasz groupBy w wymowie, zawsze dołączaj nazwę kolumny używaną w funkcji groupBy w funkcji select ().
$loadids=explode("#@*",$reciptdet->loading_id); $loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
Również złą praktyką jest wyłączanie trybu ścisłego w pliku konfiguracyjnym. Może to spowodować przedostanie się do bazy danych uszkodzonych danych, takich jak nieprawidłowe daty, bez żadnych ostrzeżeń. Nie rób tego, chyba że jest to absolutnie konieczne.
źródło
Miałem ten problem, ale także po zmianie
'strict' => true
, aby'strict' => false
, błąd zniknął.To ustawienie można znaleźć w:
config \ database.php
'mysql' => [ ... 'strict' => false, ... ]
źródło
aktualizacja
config/database.php
zestaw:
'mysql' => [ 'strict' => false, ],
zamiast:
'mysql' => [ 'strict' => true, ],
i nie zapomnij wyczyścić pamięci podręcznej:
źródło
To ograniczenie ma sens, ponieważ gdy używasz
GROUP BY
w MySQL, zwraca jeden wiersz dla każdej wartości w kolumnach używanych wGROUP BY
. Tak więc wartości innych kolumn w wybranych wierszach nie mają sensu nigdzie ich używać. Dlatego zawsze zaleca się stosowanie najlepszych praktyk i nie zaleca się wyłączania trybu ścisłego MySQL.Często programiści mogą potrzebować wierszy zapytania pogrupowanych według wartości kolumny. Tutaj nie potrzebują tylko jednego wiersza na unikalne wartości kolumn. Ale potrzebują wielu wierszy pogrupowanych według unikatowych wartości określonej kolumny. Z jakiegoś powodu używają
groupBy
metody Laravel Query Builder, która generujeGROUP BY
zapytanie MySQL i programiści napotykają powyższy błąd.Rozwiązaniem ich problemu jest użycie
groupBy
metody Collection. Na przykład,$loadingData = DB::table('loading') ->whereIn('id', $loadIds) ->get() ->groupBy('vehicle_no');
To da im pożądany efekt.
źródło
dodaj
\Schema::defaultStringLength(191);
doboot
metodyclass AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // \Schema::defaultStringLength(191); } }
źródło
Równie dobrze możesz użyć:
odrębny ('pojazd_nie')
zamiast groupBy („vehicle_no”) każdy scenariusz jest inny, ale patrząc na twoje zapytanie, inny może być drogą do zrobienia, ponieważ nie agregujesz danych.
źródło