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)

Karthikvijayaveni
sumber
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.

Husam
sumber
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,
],
Antonio Carlos Ribeiro
sumber
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');
cespon
sumber
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.

Thungdemo
sumber
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,
    ...
]
Zakhele
sumber
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
Gouda Elalfy
sumber
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.

Debiprasad
sumber
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.

ben.c
sumber
-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);
    }
}
hamed hossani
sumber