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)
loading
manaid
di (14, 15, 16) grup olehvehicle_no
) @aynberJawaban:
Jawaban singkat
Dalam
config\database.php
->"mysql"
larikSetel
'strict' => false
untuk menonaktifkan semua..... atau
Anda dapat keluar
'strict' => true
dan 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.
sumber
php artisan config:cache
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 sajastrict=true
dan tidak akan menyentuh apapunmode
. Saya lebih suka memperbarui kode saya untuk bekerja dengan pengaturan ketat seperti itu.ThisPractice === SleepWellEveryNight
:)Ini mungkin masalah SQL_MODE . Dalam
config/database.php
hubungan Anda, ubahstrict => 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, ],
sumber
Tanpa memodifikasi file config \ database.php
Set
'strict' => false
diconfig\database.php
bisa menjadi masalah keamanan . Jadi, solusi Laravel sederhana bisa menjadi panggilan pertamaget()
dan kemudiangroupBy('vehicle_no)
:$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');
sumber
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.
sumber
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, ... ]
sumber
memperbarui
config/database.php
set:
'mysql' => [ 'strict' => false, ],
dari pada:
'mysql' => [ 'strict' => true, ],
dan jangan lupa untuk membersihkan cache:
sumber
Pembatasan ini masuk akal karena ketika Anda menggunakan
GROUP BY
MySQL, ia mengembalikan satu baris untuk setiap nilai di kolom yang digunakanGROUP 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
groupBy
metode Query Builder dari Laravel yang menghasilkanGROUP BY
kueri MySQL dan pengembang menemukan kesalahan di atas.Solusi untuk masalah mereka adalah dengan menggunakan
groupBy
metode Collection. Sebagai contoh,$loadingData = DB::table('loading') ->whereIn('id', $loadIds) ->get() ->groupBy('vehicle_no');
Ini akan memberi mereka hasil yang diinginkan.
sumber
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.
sumber
tambahkan
\Schema::defaultStringLength(191);
keboot
metodeclass AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // \Schema::defaultStringLength(191); } }
sumber