Dapatkan Query Eksekusi di Laravel 3/4

182

Bagaimana saya bisa mengambil kueri SQL yang dieksekusi mentah di Laravel 3/4 menggunakan Laravel Query Builder atau Eloquent ORM?

Misalnya, sesuatu seperti ini:

DB::table('users')->where_status(1)->get();

Atau:

(posts (id, user_id, ...))

User::find(1)->posts->get();

Kalau tidak, paling tidak bagaimana cara saya menyimpan semua permintaan yang dieksekusi ke laravel.log?

Patrick Maciel
sumber
bagaimana dengan di laravel 5?
Chaudhry Waqas
@Adamnick di sini: stackoverflow.com/questions/27753868/…
Patrick Maciel

Jawaban:

318

Laravel 4+

Di Laravel 4 dan yang lebih baru, Anda harus menelepon DB::getQueryLog()untuk mendapatkan semua kueri berlari.

$queries = DB::getQueryLog();
$last_query = end($queries);

Atau Anda dapat mengunduh paket profiler. Saya akan merekomendasikan barryvdh / laravel-debugbar , yang cukup rapi. Anda dapat membaca instruksi tentang cara menginstal di repositori mereka .

Catatan untuk pengguna Laravel 5: Anda harus menelepon DB::enableQueryLog()sebelum menjalankan kueri. Baik tepat di atas garis yang menjalankan kueri atau di dalam middleware.


Laravel 3

Di Laravel 3, Anda bisa mendapatkan kueri yang dieksekusi terakhir dari Eloquentmodel yang memanggil metode statis last_querydi DBkelas.

DB::last_query();

Namun, ini mengharuskan Anda mengaktifkan profileropsi di application/config/database.php. Atau Anda bisa, seperti disebutkan @dualed, mengaktifkan profileropsi, di application/config/application.phpatau panggilan DB::profile()untuk mendapatkan semua pertanyaan berjalan dalam permintaan saat ini dan waktu eksekusi mereka.

rmobis
sumber
2
Kode Anda untuk Laravel 4 tidak berfungsi. Saya mendapatkan ini ErrorException: Peringatan: call_user_func_array()mengharapkan parameter 1 menjadi panggilan balik yang valid, kelas Illuminate\Database\MySqlConnectiontidak memiliki metode getQueryList.
dualitas_
Buruk saya, metode yang benar adalah getQueryLog. Perbaiki sekarang. Terima kasih!
rmobis
Aneh ... Saya mendapatkan last_query () tidak didefinisikan pada kesalahan objek Query. Saya hanya memanggil model Eloquent yang tidak terbukti.
Aditya MP
1
Untuk Laravel 3 sebenarnya DB :: last_query (); Anda juga perlu mengatur 'profil' menjadi true di aplikasi / config / database.php Anda
Dan Smart
4
Ini tampaknya tidak berfungsi untuk Model Eloquent pada L4. Ketika saya menjalankan Model :: find ($ id) dan melakukan DB :: getQueryLog () mengembalikan array kosong (). Adakah yang tahu bagaimana cara mendapatkan kueri untuk Model Eloquent?
Abishek
31

Anda dapat mengaktifkan " Profiler " di Laravel 3 dengan mengatur

'profiler' => true,

Di Anda application/config/application.phpdanapplication/config/database.php

Ini memungkinkan bilah di bagian bawah setiap halaman. Salah satu fiturnya adalah daftar pertanyaan yang dieksekusi dan berapa lama masing-masing diperlukan.

masukkan deskripsi gambar di sini

ganda
sumber
14
Perhatikan bahwa di Laravel 4, Profiler tidak termasuk, Anda harus menginstalnya sendiri (misalnya menggunakan komposer). Lihat pertanyaan SO ini .
dualitas_
1
Itu dibahas dalam jawaban pertama di sana .
dualitas_
24

Untuk Eloquent Anda bisa melakukan:

$result->getQuery()->toSql();

Tetapi Anda harus menghapus bagian "-> get ()" dari kueri Anda.

JamesPlayer
sumber
17

Saya akan merekomendasikan menggunakan Clockwork ekstensi Chrome dengan paket Laravel https://github.com/itsgoingd/clockwork . Mudah dipasang dan digunakan.

Clockwork adalah ekstensi Chrome untuk pengembangan PHP, memperluas Alat Pengembang dengan panel baru yang menyediakan semua jenis informasi yang berguna untuk debugging dan profil skrip PHP Anda, termasuk informasi berdasarkan permintaan, header, DAPATKAN dan data POST, cookie, data sesi, kueri basis data, rute, visualisasi runtime aplikasi dan banyak lagi. Clockwork termasuk dukungan di luar kotak untuk aplikasi berbasis Laravel 4 dan Slim 2, Anda dapat menambahkan dukungan untuk kerangka kerja lain atau kustom melalui API yang dapat diperluas.

masukkan deskripsi gambar di sini

Znarkus
sumber
16

Karena profiler belum keluar di Laravel 4 , saya telah membuat fungsi pembantu ini untuk melihat SQL yang dihasilkan:

    fungsi statis publik q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = end ($ queries);
            kembalikan $ last_query;
        }

        mengembalikan $ query;
    }

CATATAN : Atur flag $ all ke false jika Anda hanya ingin query SQL terakhir.

Saya menyimpan fungsi semacam ini di kelas yang disebut DBH.php (kependekan dari Database Helper) sehingga saya dapat memanggilnya dari mana saja seperti ini:

dd(DBH::q()); 

Ini adalah output yang saya dapatkan: masukkan deskripsi gambar di sini

Jika Anda bertanya-tanya, saya menggunakan Kint untuk format dd (). http://raveren.github.io/kint/

Ricardo Rossi
sumber
1
if($all == false)? Mengapa tidak sederhanaif(!$all)
toesslab
14

Untuk Laraver 4 itu

DB::getQueryLog()
misaizdaleka
sumber
14

Berikut ini cuplikan singkat Javascript yang dapat Anda lemparkan ke templat halaman master Anda. Selama ini dimasukkan, semua permintaan akan ditampilkan ke Javascript Console browser Anda. Ini mencetaknya dalam daftar yang mudah dibaca, membuatnya mudah untuk menelusuri situs Anda dan melihat permintaan apa yang dieksekusi pada setiap halaman.

Setelah selesai debugging, hapus saja dari template Anda.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>
Adam
sumber
Saya pikir Anda perlu "" di sekitar bagian {{json_encode ...}}
mydoglixu
@mydoglixu Sejak DB::getQueryLog()mengembalikan array, tidak perlu mengelilinginya dengan "". json_encodeakan menerjemahkannya sesuai.
rmobis
@mobis - maksud saya Anda membutuhkan "" di luar {{...}} agar javascript tidak menimbulkan kesalahan. seperti ini: var queries = "json output";
mydoglixu
@ mydoglixu Anda tidak melakukannya, karena array JSON (atau objek) adalah JavaScript yang valid. Itu akan hancur jika kamu melakukannya.
rmobis
@mobis - oh yeah, duh
mydoglixu
10

Laravel 5

Perhatikan bahwa ini adalah pendekatan prosedural , yang saya gunakan untuk debugging cepat

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

di tajuk Anda, gunakan:

     use DB;
     use Illuminate\Support\Facades\Log;

Outputnya akan terlihat seperti ini (file log default adalah laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Query 0: {"query": "pilih * dari 'pengguna' di mana ('user_id' =?)", "Binding": ["9"] , "waktu": 0,23}

*** Saya tahu pertanyaan ini menentukan Laravel 3/4 tetapi halaman ini muncul saat mencari jawaban umum. Pemula untuk Laravel mungkin tidak tahu ada perbedaan antara versi. Karena saya tidak pernah melihat yang DD::enableQueryLog()disebutkan dalam salah satu jawaban yang biasanya saya temukan, itu mungkin khusus untuk Laravel 5 - mungkin seseorang dapat mengomentari itu.

Bryan
sumber
7

Anda juga dapat mendengarkan acara permintaan menggunakan ini:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

Lihat informasi dari dokumen di sini di bawah Acara Mendengarkan Untuk Permintaan

Foto
sumber
6

Menggunakan log kueri tidak memberi Anda kueri RAW aktual yang dieksekusi, terutama jika ada nilai terikat. Ini adalah pendekatan terbaik untuk mendapatkan sql mentah:

DB::table('tablename')->toSql();

atau lebih terlibat:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
omar j
sumber
5

Jika Anda menggunakan Laravel 5, Anda harus memasukkan ini sebelum kueri atau di middleware:

\DB::enableQueryLog();
Mandeep Gill
sumber
3

di Laravel 4 Anda sebenarnya dapat menggunakan Event Listener untuk kueri basis data.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Letakkan cuplikan ini di mana saja, misalnya di start/global.php. Ini akan menulis pertanyaan ke log info ( storage/log/laravel.log).

aebersold
sumber
3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

letakkan di global.php maka akan mencatat kueri sql Anda.

Christland
sumber
2

Profiler Loic Sharma SQL tidak mendukung Laravel 4, saya baru saja menginstalnya. Petunjuknya tercantum di sini . Langkah-langkahnya adalah sebagai berikut:

  1. Tambahkan "loic-sharma/profiler": "1.1.*"bagian yang diperlukan di composer.json
  2. Lakukan pembaruan sendiri => php composer.phar self-updatedi konsol.
  3. Lakukan pembaruan komposer => php composer.phar update loic-sharma/profilerdi konsol juga `
  4. Tambahkan 'Profiler\ProfilerServiceProvider',array penyedia di app.php
  5. Tambahkan 'Profiler' => 'Profiler\Facades\Profiler',juga array aliasses di app.php
  6. Jalankan php artisan config:publish loic-sharma/profilerdi konsol
sepeda
sumber
2

Cetak kueri terakhir

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);
Dulitha Kumarasiri
sumber
1

L4 satu-liner

(yang menulis kueri):

$q=\DB::getQueryLog();dd(end($q));

Kamil Kiełczewski
sumber
0

Laravel 3

Cara lain untuk melakukan ini adalah:

#config/database.php

'profiler' => true

Untuk semua hasil Pertanyaan:

print_r(DB::profiler());

Untuk Hasil Terakhir:

print_r(DB::last_query());
Wallace Maxters
sumber
0

Untuk mendapatkan kueri yang dieksekusi terakhir di laravel, Kami akan menggunakan DB::getQueryLog()fungsi laravel untuk mengembalikan semua kueri yang dieksekusi. Untuk mendapatkan kueri terakhir kita akan menggunakan end()fungsi yang mengembalikan kueri yang dieksekusi terakhir.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

Saya telah mengambil referensi dari http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .

Manish
sumber
Jawaban Anda tampaknya tidak menyumbangkan pengetahuan baru apa pun yang sudah mencakup jawaban yang diterima oleh Raphael_.
Jaak Kütt
0

Ada cara yang sangat mudah untuk melakukannya, dari permintaan laravel Anda cukup ganti nama kolomnya, itu akan menunjukkan kesalahan pada permintaan Anda .. :)

Aamir
sumber
Cara hacky cepat. Tidak berguna dalam produksi, tetapi dalam mode pengembangan tidak masalah dalam beberapa kasus.
sebagai gantinya