Diberikan kode berikut:
DB::table('users')->get();
Saya ingin mendapatkan string kueri SQL mentah yang akan dihasilkan oleh pembuat kueri basis data di atas. Dalam contoh ini, itu akan menjadiSELECT * FROM users
.
Bagaimana saya melakukan ini?
Diberikan kode berikut:
DB::table('users')->get();
Saya ingin mendapatkan string kueri SQL mentah yang akan dihasilkan oleh pembuat kueri basis data di atas. Dalam contoh ini, itu akan menjadiSELECT * FROM users
.
Bagaimana saya melakukan ini?
echo User::where('status', 1)->toSql();
Jawaban:
Untuk menampilkan ke layar pertanyaan terakhir dijalankan, Anda dapat menggunakan ini:
Saya percaya pertanyaan terbaru akan berada di bagian bawah array.
Anda akan memiliki sesuatu seperti itu:
(Terima kasih atas komentar Joshua di bawah ini.)
sumber
Log
kelas:Log::debug(DB::getQueryLog())
DB::enableQueryLog();
DB::enableQueryLog(); dd(DB::getQueryLog());
Tapi itu mengembalikan hanya[]
....DB::connection('database')->getQueryLog()
Gunakan
toSql()
metode ini padaQueryBuilder
contoh.DB::table('users')->toSql()
akan kembali:Ini lebih mudah daripada membuat daftar pendengar acara, dan juga memungkinkan Anda memeriksa seperti apa bentuk kueri pada saat Anda membangunnya.
sumber
getBindings
metode. Ini akan mengembalikan binding agar mereka terikat pada pernyataan SQL.$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
DB::QueryLog()
hanya berfungsi setelah Anda menjalankan kueri$builder->get()
. jika Anda ingin mendapatkan kueri sebelum mengeksekusi kueri Anda dapat menggunakan$builder->toSql()
metode. ini adalah contoh cara mendapatkan sql dan mengikatnya:ATAU cukup buat kesalahan kueri Anda seperti memanggil tabel atau kolom yang tidak ada, Anda akan melihat kueri yang dihasilkan dalam pengecualian XD
sumber
$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
LIKE
kueri atau saat memformat tanggal. Anda harus melarikan diri dari yang pertama dengan tanda dua persen.$builder->getBindings()
?Anda dapat mendengarkan acara 'illuminate.query'. Sebelum kueri tambahkan pendengar acara berikut:
Ini akan mencetak sesuatu seperti:
sumber
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Event;
Anda hanya dapat melakukanuse Event;
karena itu adalah fasad .Jika Anda mencoba untuk mendapatkan Log menggunakan Illuminate tanpa Laravel use:
Anda juga dapat mengaktifkan fungsi cepat seperti:
EDIT
versi yang diperbarui tampaknya memiliki penebangan kueri dinonaktifkan secara default (di atas mengembalikan array kosong). Untuk menghidupkan kembali, saat menginisialisasi Manajer Kapsul, ambil contoh koneksi dan panggil
enableQueryLog
metodeSunting LAGI
Dengan mempertimbangkan pertanyaan aktual, Anda sebenarnya dapat melakukan hal berikut untuk mengonversi kueri tunggal saat ini alih-alih semua kueri sebelumnya:
sumber
'US/Eastern'
.quick function
. Saya percaya kode yang mendasarinya akan menggunakan metode prep ( php.net/manual/en/mysqli.prepare.php ), itulah sebabnya hanya?
diperlukan. Anda dapat php.net/manual/en/function.is-numeric.php untuk menentukan apakah akan merangkum input dalam tanda kutip tunggal.is_numeric
ide Anda ), dan berhasil! Aku suka ini. Terima kasih.Ada metode dalam fasih untuk mendapatkan string kueri.
toSql ()
dalam kasus kami,
kembali
adalah solusi tepat yang mengembalikan string kueri SQL .. Semoga ini bermanfaat ...
sumber
->where('foo', '=', 'bar')
bar tidak akan ditampilkan di sqlsumber
->toSql()
seperti yang akan Anda lakukan jika ada lebih banyak argumen setelah model. misalnyaUser::where('id', 1)->toSql()
Jika Anda menggunakan laravel 5.1 dan MySQL Anda dapat menggunakan fungsi ini yang dibuat oleh saya:
Sebagai parameter input, Anda dapat menggunakan salah satu dari ini
sumber
Pertama, Anda harus mengaktifkan log kueri dengan menelepon:
setelah permintaan menggunakan fasad DB Anda dapat menulis:
output akan seperti di bawah ini:
sumber
Ini adalah solusi terbaik yang bisa saya sarankan kepada siapa pun untuk men-debug permintaan terakhir atau permintaan terakhir yang fasih meskipun ini juga telah dibahas:
sumber
Cara pertama:
Cukup Anda dapat melakukan hal-hal berikut menggunakan
toSql()
metode,Jika tidak berfungsi, Anda dapat mengaturnya dari dokumentasi laravel .
Cara kedua:
Cara lain untuk melakukannya adalah
DB::getQueryLog()
tetapi jika itu mengembalikan array kosong maka secara default itu dinonaktifkan kunjungi ini ,
cukup aktifkan dengan
DB::enableQueryLog()
dan itu akan bekerja :)untuk info lebih lanjut kunjungi Masalah Github untuk mengetahui lebih banyak tentangnya.
Semoga bermanfaat :)
sumber
Sebuah 'macroable' pengganti untuk mendapatkan query SQL dengan binding.
Tambahkan fungsi makro di bawah ini dalam metode.
AppServiceProvider
boot()
Tambahkan alias untuk Eloquent Builder. ( Laravel 5.4+ )
Kemudian debug seperti biasa. ( Laravel 5.4+ )
Misalnya Pembuat Kueri
Misalnya Eloquent Builder
Misalnya Eloquent Builder ( Laravel 5.1 - 5.3 )
sumber
gunakan paket debugbar
sumber
Dari laravel
5.2
dan seterusnya. Anda dapat menggunakanDB::listen
untuk mendapatkan kueri yang dieksekusi.Atau jika Anda ingin men-debug
Builder
instance tunggal maka Anda dapat menggunakantoSql
metode.sumber
Cara paling mudah adalah dengan membuat kesalahan yang disengaja . Misalnya, saya ingin melihat kueri SQL lengkap dari relasi berikut:
Saya hanya membuat kolom agar tidak ditemukan, di sini saya pilih
created_at
dan saya mengubahnyacreated_ats
dengan menambahkan trailings
menjadi:Jadi, debuger akan mengembalikan kesalahan berikut:
Pesan kesalahan di atas mengembalikan permintaan SQL lengkap dengan kesalahan
Sekarang, hapus saja ekstra
s
dari Created_at dan uji SQL ini sesuka Anda dalam editor SQL apa pun seperti editor SQL phpMyAdmin!sumber
:id
Untuk Melihat Laravel Query Eksekusi gunakan log kueri laravel
sumber
Pada Laravel 5.8.15 pembuat kueri sekarang memiliki
dd
dandump
metode sehingga Anda dapat melakukannyasumber
Inilah fungsinya, saya ditempatkan di kelas model dasar saya. Cukup masukkan objek pembuat kueri ke dalamnya dan string SQL akan dikembalikan.
sumber
Menurut pendapat saya, ini akan menjadi pendekatan terbaik sebagai pemula:
Ini juga digambarkan di sini. https://stackoverflow.com/a/59207557/9573341
sumber
Untuk laravel 5.5.X
Jika Anda ingin menerima setiap permintaan SQL yang dijalankan oleh aplikasi Anda, Anda dapat menggunakan metode mendengarkan. Metode ini berguna untuk mencatat kueri atau debugging. Anda dapat mendaftarkan pendengar kueri Anda di penyedia layanan:
Sumber
sumber
Tambahkan fungsi ini ke aplikasi Anda dan cukup panggil.
Output : "pilih * dari
user
manalang
= 'en' danstatus
= '1' pesan denganupdated_at
batas desc 25 offset 0"sumber
Anda dapat menggunakan paket ini untuk mendapatkan semua pertanyaan yang dieksekusi saat Anda memuat halaman Anda
sumber
Cetak kueri terakhir
sumber
Jika Anda tidak menggunakan Laravel tetapi menggunakan paket Eloquent maka:
sumber
Anda bisa menggunakan jarum jam
tetapi berfungsi juga di firefox
sumber
Saya telah membuat beberapa fungsi sederhana untuk mendapatkan SQL dan binding dari beberapa query.
Pemakaian:
sumber
Seperti halnya saya menyukai kerangka ini, saya benci kalau itu bertindak seperti omong kosong.
DB::enableQueryLog()
sama sekali tidak berguna.DB::listen
sama-sama tidak berguna. Itu menunjukkan bagian dari permintaan ketika saya berkata$query->count()
, tetapi jika saya lakukan$query->get()
, tidak ada yang bisa dikatakan.Satu-satunya solusi yang tampaknya bekerja secara konsisten adalah dengan sengaja menempatkan beberapa sintaks atau kesalahan lain dalam parameter ORM, seperti nama kolom / tabel yang tidak ada, jalankan kode Anda pada baris perintah saat dalam mode debug, dan itu akan memuntahkan kesalahan SQL dengan permintaan penuh akhirnya. Kalau tidak, mudah-mudahan kesalahan muncul di file log jika dijalankan dari server web.
sumber
Jika Anda menggunakan tinker dan ingin mencatat permintaan SQL yang terbentuk, Anda bisa melakukannya
sumber
Coba ini:
Catatan: get () telah diganti dengan toSql () untuk menampilkan kueri SQL mentah.
sumber
Cara saya melakukan ini, berdasarkan tampilan log, hanya perlu memodifikasi file
app/Providers/AppServiceProvider.php
:app/Providers/AppServiceProvider.php
storage/logs/laravel-2019-10-27.log
:sumber