Laravel: Kesalahan sintaks atau pelanggaran akses: Kesalahan 1055


93

Saya ingin menggunakan WhereIn dan Groupby di Same Query untuk mengambil Hasil.

Saya sudah mencoba ini:

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

Tapi saya mendapat pesan kesalahan ini:

SQLSTATE [42000]: Kesalahan sintaks atau pelanggaran akses: 1055 'sbrtpt.loading.id' tidak ada di GROUP BY (SQL: pilih * dari pemuatan di mana id di (14, 15, 16) grup oleh vehicle_no)


Ganti pernyataan groupBy and whereIn Anda
aynber

Tidak berfungsi @aynber
Karthikvijayaveni

Bisakah Anda mencetak pesan kesalahan lengkap Anda?
aynber

SQLSTATE [42000]: Kesalahan sintaks atau pelanggaran akses: 1055 'sbrtpt.loading.id' tidak ada di GROUP BY (SQL: pilih * dari loadingmana iddi (14, 15, 16) grup oleh vehicle_no) @aynber
Karthikvijayaveni

Jawaban:


212

Jawaban singkat

Dalam config\database.php-> "mysql"larik

Setel 'strict' => falseuntuk menonaktifkan semua.

.... atau

Anda dapat keluar 'strict' => truedan menambahkan mode ke "mysql"opsi masuk

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

Jawaban rinci

Anda mungkin tidak perlu menonaktifkan semua opsi ketat ... Mohon lihat jawaban ini tentang masalah ini.


2
Terima kasih untuk solusi yang bagus. masalah ini membunuh 3 jam saya
Sarower Jahan

Bagaimana cara menyetel mode ketat ini ke false pada koneksi oracle di laravel? Tolong bantu saya
Vikas Chauhan

@VikasChauhan, Maaf saya tidak menggunakan Oracle sebelumnya
Husam

3
Ini berhasil !!! Untuk siapa saja yang masih mendapatkan kesalahan yang sama setelah mengubah pengaturan itu, coba bersihkan cache konfigurasi dengan menjalankanphp artisan config:cache
Altin

Kekhawatiran saya tentang solusi hard code semacam ini adalah bahwa saya merasakan semacam hutang teknis yang tidak akan membuat saya tidur nyenyak di malam hari, karena jenis pertanyaan yang akan melayang di kepala saya adalah seperti: apa yang terjadi ketika Laravel dan / atau perubahan spesifikasi MySQL dengan modes(misalnya penambahan / penghapusan beberapa mode yang ditentukan dalam larik itu, atau lebih buruk lagi, nama salah satu mode yang ditentukan dalam larik itu berubah). Jadi, saya pergi begitu saja strict=truedan tidak akan menyentuh apapun mode. Saya lebih suka memperbarui kode saya untuk bekerja dengan pengaturan ketat seperti itu. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

106

Ini mungkin masalah SQL_MODE . Dalam config/database.phphubungan Anda, ubah

strict => false

Seperti dalam

'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
Dalam Metode ini dapat membuat masalah keamanan apa pun @Antonio Carlos Ribeiro
Karthikvijayaveni

Saya yakin ini aman atau Anda tidak akan memiliki opsi di Laravel untuk menonaktifkannya.
Antonio Carlos Ribeiro

10

Tanpa memodifikasi file config \ database.php

Set'strict' => false di config\database.phpbisa menjadi masalah keamanan . Jadi, solusi Laravel sederhana bisa menjadi panggilan pertama get()dan kemudiangroupBy('vehicle_no) :

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

Saya tidak bisa mendapatkan hasil yang tepat ketika 'strict' => false. maka solusi ini berfungsi dengan baik jika Anda mencoba data grup saat kueri. Terima kasih atas jawabannya.
ireshan pathirana

6

Setiap kali menggunakan groupBy dalam eloquent, selalu sertakan nama kolom yang digunakan dalam fungsi groupBy di fungsi select ().

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

Juga merupakan praktik yang buruk untuk menonaktifkan mode ketat di file konfigurasi. Melakukannya dapat menyebabkan data yang rusak masuk ke database seperti tanggal tidak valid tanpa peringatan apa pun. Jangan lakukan itu kecuali benar-benar diperlukan.


Penambahan -> pilih ('kolom') berhasil untuk saya. Terima kasih sobat :)
Shaan

5

Saya juga mengalami masalah ini, tetapi setelah mengubah 'strict' => true, ke 'strict' => false, kesalahan tersebut menghilang.

Anda dapat menemukan pengaturan ini di:

config \ database.php

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

Bagaimana kita bisa melakukan itu untuk koneksi oracle di laravel
Vikas Chauhan

3

memperbarui config/database.php

set:

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

dari pada:

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

dan jangan lupa untuk membersihkan cache:

php artisan config:cache

selain dijawab pada tahun 2016 jika saya dapat memilih Anda seribu kali saya akan. menggedornya sekitar 24 jam tanpa petunjuk apa pun itu di-cache. Love you man <3
Faisal Mehmood Awan

2

Pembatasan ini masuk akal karena ketika Anda menggunakan GROUP BYMySQL, ia mengembalikan satu baris untuk setiap nilai di kolom yang digunakan GROUP BY. Jadi, nilai kolom lain di baris yang dipilih tidak masuk akal untuk digunakan di mana pun. Jadi, selalu disarankan untuk menggunakan praktik terbaik dan saya sarankan untuk tidak menonaktifkan Mode Ketat MySQL.

Seringkali pengembang mungkin membutuhkan baris kueri yang dikelompokkan berdasarkan nilai kolom. Di sini mereka tidak hanya membutuhkan satu baris untuk setiap nilai unik kolom. Tetapi mereka membutuhkan beberapa baris yang dikelompokkan berdasarkan nilai unik dari kolom tertentu. Untuk beberapa alasan, mereka menggunakan groupBymetode Query Builder dari Laravel yang menghasilkan GROUP BYkueri MySQL dan pengembang menemukan kesalahan di atas.

Solusi untuk masalah mereka adalah dengan menggunakan groupBymetode Collection. Sebagai contoh,

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

Ini akan memberi mereka hasil yang diinginkan.


0

Anda mungkin juga menggunakan:

berbeda ('vehicle_no')

alih-alih groupBy ('vehicle_no') setiap skenario kasus berbeda, tetapi melihat kueri Anda, berbeda mungkin cara untuk pergi karena Anda tidak menggabungkan data.


-1

tambahkan \Schema::defaultStringLength(191);ke bootmetode

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);
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.