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)

Karthikvijayaveni
źródło
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.

Husam
źródło
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,
],
Antonio Carlos Ribeiro
źródło
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');
cespon
źródło
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.

Thungdemo
źródło
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,
    ...
]
Zakhele
źródło
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
Gouda Elalfy
źródło
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.

Debiprasad
źródło
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);
    }
}
hamed hossani
źródło
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.

ben.c
źródło