Laravel: Sözdizimi hatası veya erişim ihlali: 1055 Hatası


93

Sonuç getirmek için Aynı Sorguda WhereIn ve Groupby'yi kullanmak istiyorum.

Bunu denedim:

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

Ama bu hata mesajını aldım:

SQLSTATE [42000]: Sözdizimi hatası veya erişim ihlali: 1055 'sbrtpt.loading.id' GROUP BY'da değil (SQL: id'nin (14, 15, 16) group by vehicle_no)


By and whereIn ifadeleri etrafında
aynber

Çalışmıyor @aynber
Karthikvijayaveni

Tam hata mesajınızı yazdırabilir misiniz?
aynber

Sqlstate [42000]: sözdizimi hatası veya erişim ihlali: (: seçin SQL * 1055 Grubu tarafından değil 'sbrtpt.loading.id' loadingburada id(14, 15, 16) grubu ile vehicle_no) @aynber
Karthikvijayaveni

Yanıtlar:


212

Kısa cevap

İç config\database.php-> "mysql"dizi

'strict' => falseTümünü devre dışı bırakmak için ayarlayın .

.... veya

Ayrılabilir 'strict' => trueve "mysql"seçeneğe mod ekleyebilirsiniz

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

Ayrıntılı cevap

Tüm katı seçenekleri devre dışı bırakmanız gerekmeyebilir ... Lütfen bu konuyla ilgili bu yanıta bir göz atın .


2
Harika bir çözüm için teşekkürler. bu sorun benim 3 saatimi öldürdü
Sarower Jahan

Laravel'deki oracle bağlantısında bu katı modu nasıl yanlış olarak ayarlayabiliriz? Lütfen bana yardım edin
Vikas Chauhan

@VikasChauhan, Üzgünüm Oracle'ı daha önce kullanmadım
Husam

3
Bu işe yaradı !!! Bu ayarı değiştirdikten sonra hala aynı hatayı alan herkes için yapılandırma önbelleğini temizlemeyi deneyinphp artisan config:cache
Altin

Bu tür sabit kodlanmış geçici çözümle ilgili endişem, geceleri beni iyi uyutmayacak bir tür teknik borç hissetmemdir, çünkü kafamda dolaşacak türden sorular şöyle olacaktır: Laravel ve / veya MySQL spesifikasyon değişiklikleri modes(örneğin, o dizide belirtilen modlardan bazılarının eklenmesi / kaldırılması veya daha da kötüsü, o dizide belirtilen modlardan birinin adı değişir). Bu yüzden, gidiyorum strict=trueve hiçbir modeşeye dokunmayacağım . Kodumu bu kadar katı ayarlarla çalışacak şekilde güncellemeyi tercih ederim. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

106

Bu muhtemelen bir SQL_MODE problemidir. Senin config/database.phpiçinde, bağlantında, değişim

strict => false

De olduğu gibi

'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
Bu
Yöntemde

Güvenli olduğuna inanıyorum ya da Laravel'de devre dışı bırakma seçeneğiniz olmayacak.
Antonio Carlos Ribeiro

10

Config \ database.php dosyasını değiştirmeden

Set'strict' => false , config\database.phpbir güvenlik sorunu olabilir . Dolayısıyla, basit bir Laravel çözümü önce arama get()ve ardındangroupBy('vehicle_no) :

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

'Sıkı' => yanlış olduğunda düzgün sonuç alamadım. o zaman bu çözüm, sorgu sırasında grup verilerini denerseniz iyi çalışır. Cevap için teşekkür ederim.
ireshan pathirana

6

GroupBy'yi anlamlı olarak kullanırken, her zaman select () işlevindeki groupBy işlevinde kullanılan sütun adını dahil edin.

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

Ayrıca, yapılandırma dosyasında katı modu devre dışı bırakmak kötü bir uygulamadır. Bunu yapmak, geçersiz tarihler gibi bozuk verilerin herhangi bir uyarı olmaksızın veritabanına girmesine neden olabilir. Kesinlikle gerekmedikçe bunu yapmayın.


Eklenmesi -> seçim ('sütun') benim için çalıştı. Teşekkürler dostum :)
Shaan

5

Ben de bu sorunu yaşıyor ama değiştirdikten sonra 'strict' => trueiçin 'strict' => false, hata kayboldu.

Bu ayarı şurada bulabilirsiniz:

config \ database.php

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

Laravel'deki oracle bağlantısı için bunu nasıl yapabiliriz
Vikas Chauhan

3

Güncelleme config/database.php

Ayarlamak:

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

onun yerine:

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

ve önbelleği temizlemeyi unutmayın:

php artisan config:cache

2016'da cevaplanmanın yanı sıra bin kez sana oy verebilirsem yapacağım. Önbelleğe alındığına dair herhangi bir ipucu olmadan yaklaşık 24 saat onunla vuruyor. Love you man <3
Faisal Mehmood Awan

2

Bu kısıtlama, MySQL'de kullandığınızda anlamlıdır, GROUP BYkullanılan sütunlardaki her bir değer için bir satır döndürür GROUP BY. Bu nedenle, seçilen satırlardaki diğer sütunların değerleri herhangi bir yerde kullanmak mantıklı değildir. Bu nedenle, her zaman en iyi uygulamayı kullanmanız önerilir ve MySQL Strict Mode'u devre dışı bırakmamanızı tavsiye ederim.

Genellikle geliştiriciler, bir sütunun değerine göre gruplanmış bir sorgu satırlarına ihtiyaç duyabilir. Burada, sütunların benzersiz değerleri için yalnızca bir satıra ihtiyaçları yoktur. Ancak, belirli bir sütunun benzersiz değerlerine göre gruplandırılmış birden çok satıra ihtiyaçları vardır. Nedense, groupBybir MySQL GROUP BYsorgusu oluşturan Laravel'in Query Builder yöntemini kullanıyorlar ve geliştiriciler yukarıdaki hatayla karşılaşıyorlar.

Sorunlarının çözümü groupBybunun yerine Koleksiyon yöntemini kullanmaktır. Örneğin,

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

Bu onlara istenen sonucu verecektir.


0

Sen de kullanabilirsin:

farklı ('araç_no')

groupBy ('vehicle_no') yerine her durum senaryosu farklıdır, ancak sorgunuza bakıldığında, verileri toplamadığınız için gitmeniz gereken yol farklı olabilir.


-1

eklemek \Schema::defaultStringLength(191);için bootbir yöntem

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);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.