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?


bagaimana dengan di laravel 5?
Chaudhry Waqas

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.


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


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.


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


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/


1
if($all == false)? Mengapa tidak sederhanaif(!$all)
toesslab


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>

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.


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


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);

5

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

\DB::enableQueryLog();


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).


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.


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

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);


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());

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 .


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 .. :)


Cara hacky cepat. Tidak berguna dalam produksi, tetapi dalam mode pengembangan tidak masalah dalam beberapa kasus.
sebagai gantinya
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.