Laravel: Błąd składni lub naruszenie zasad dostępu: Błąd 1055


89

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)


Przełącz grupę przez i gdzie W oświadczeniach wokół
aynber

Nie działa @aynber
Karthikvijayaveni

Czy możesz wydrukować pełny komunikat o błędzie?
aynber

SQLSTATE [42000]: Błąd składni lub naruszenie zasad dostępu: 1055 „sbrtpt.loading.id” nie znajduje się w GROUP BY (SQL: wybierz * loadingskąd idw (14, 15, 16 vehicle_no) grupuj według ) @aynber
Karthikvijayaveni

Odpowiedzi:


199

Krótka odpowiedź

W config\database.php-> "mysql"tablicy

Ustaw, 'strict' => falseaby wyłączyć wszystkie.

.... lub

Możesz opuścić 'strict' => truei 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.


2
Dzięki za świetne rozwiązanie. ten problem zabił moje 3 godziny
Sarower Jahan

Jak możemy ustawić ten ścisły tryb na fałsz w połączeniu z Oracle w Laravel? Proszę, pomóż mi
Vikas Chauhan

@VikasChauhan, przepraszam, że wcześniej nie korzystałem z Oracle
Husam

2
To zadziałało !!! Dla każdego, kto nadal otrzymuje ten sam błąd po zmianie tego ustawienia, spróbuj wyczyścić pamięć podręczną konfiguracji, uruchamiającphp artisan config:cache
Altin

Martwię się o tego rodzaju zakodowane na stałe obejście, ponieważ czuję pewien rodzaj długu technicznego, który nie sprawi, że będę spał dobrze w nocy, ponieważ rodzaj pytań, które będą pojawiać się w mojej głowie, będą brzmiały: co się stanie, gdy Laravel i / lub zmiany specyfikacji MySQL 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=truei niczego nie moderuszam. Raczej zaktualizuję mój kod, aby działał z tak ścisłym ustawieniem. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

105

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

1
W tej metodzie może spowodować każdy problem z bezpieczeństwem @Antonio Carlos Ribeiro
Karthikvijayaveni

Uważam, że jest to bezpieczne, inaczej nie miałbyś opcji na Laravel, aby go wyłączyć.
Antonio Carlos Ribeiro

7

Bez modyfikowania pliku config \ database.php

Ustawiony'strict' => false w config\database.phpmoż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');

Nie udało mi się uzyskać prawidłowego wyniku, gdy „strict” => false. to rozwiązanie działa dobrze, jeśli próbujesz grupować dane podczas zapytania. Dziękuję za Twoją odpowiedź.
ireshan pathirana

6

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.


Dodanie -> select ('kolumna') zadziałało. Dzięki kolego :)
Shaan

5

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

Jak możemy to zrobić dla połączenia Oracle w Laravel
Vikas Chauhan

3

aktualizacja config/database.php

zestaw:

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

zamiast:

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

i nie zapomnij wyczyścić pamięci podręcznej:

php artisan config:cache

Oprócz odpowiedzi w 2016 r., jeśli mogę głosować na ciebie tysiąc razy, to zrobię. walić z nim przez około 24 godziny bez żadnej wskazówki, że jest buforowany. Kocham cię człowieku <3
Faisal Mehmood Awan

2

To ograniczenie ma sens, ponieważ gdy używasz GROUP BYw MySQL, zwraca jeden wiersz dla każdej wartości w kolumnach używanych w GROUP 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ą groupBymetody Laravel Query Builder, która generuje GROUP BYzapytanie MySQL i programiści napotykają powyższy błąd.

Rozwiązaniem ich problemu jest użycie groupBymetody Collection. Na przykład,

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

To da im pożądany efekt.


0

dodaj \Schema::defaultStringLength(191);do bootmetody

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);
    }
}

0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.