Laravel 3/4'te Sorguyu Çalıştırın


182

Laravel Query Builder veya Eloquent ORM kullanarak Laravel 3/4'te ham yürütülmüş SQL sorgusunu nasıl alabilirim?

Örneğin, böyle bir şey:

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

Veya:

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

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

Aksi takdirde, en azından laravel.log için yürütülen tüm sorguları nasıl kaydedebilirim?


Laravel 5'te ne olacak?
Chaudhry Waqas

Yanıtlar:


318

Laravel 4+

Laravel 4 ve sonrasında, DB::getQueryLog()çalıştırılan tüm sorguları almak için aramanız gerekir.

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

Veya bir profil oluşturucu paketi indirebilirsiniz. Oldukça temiz barryvdh / laravel-debugbar tavsiye ederim . Havuzlarına nasıl kurulacağına ilişkin talimatları okuyabilirsiniz .

Laravel 5 kullanıcıları için not:DB::enableQueryLog() Sorguyu yürütmeden önce aramanız gerekir . Sorguyu çalıştıran çizginin hemen üstünde veya bir ara katman yazılımı içinde.


Laravel 3

Laravel 3'te, bir son infaz sorgu alabilirsiniz Eloquentstatik yöntemini çağırarak modeli last_queryüzerinde DBsınıfına.

DB::last_query();

Ancak bu, içindeki profilerseçeneği etkinleştirmenizi gerektirir application/config/database.php. Alternatif olarak, @dualed'in belirttiği gibi, tüm isteklerin geçerli istekte ve yürütme süresinde çalıştırılmasını sağlamak için profilerseçeneği etkinleştirebilir application/config/application.phpveya arayabilirsiniz DB::profile().


2
Laravel 4 kodunuz çalışmıyor. Bunu alıyorum ErrorException: Uyarı: call_user_func_array()parametre 1 geçerli bir geri arama olmasını bekliyor, sınıf Illuminate\Database\MySqlConnectionbir yöntemi yok getQueryList.
duality_

Benim hatam, doğru yöntem getQueryLog. Şimdi düzeltildi. Teşekkürler!
rmobis

Garip ... Ben sorgu nesnesi hatası last_query () tanımlı değil olsun. Ben sadece ispatlanmamış bir Eloquent modelini arıyorum.
Aditya MP

1
Laravel 3 için aslında DB :: last_query (); Ayrıca 'profile' öğesini application / config / database.php dosyasında true olarak ayarlamanız gerekir
Dan Smart

4
Bu, L4'te Eloquent Model için işe yaramıyor gibi görünüyor. Model :: find ($ id) yürüttüğümde ve DB :: getQueryLog () gerçekleştirildiğinde boş dizi () döndür. Bir Eloquent Modeli için sorguları nasıl alabilirim?
Abishek

31

Laravel 3'te " Profiler " i ayarlayarak

'profiler' => true,

Sizin application/config/application.phpveapplication/config/database.php

Bu, her sayfanın altında bir çubuk olmasını sağlar. Özelliklerinden biri, yürütülen sorguları ve her birinin ne kadar sürdüğünü listelemektir.

resim açıklamasını buraya girin


14
Laravel 4'te Profiler'ın dahil edilmediğini, kendiniz yüklemeniz gerektiğini unutmayın (örn. Besteci kullanarak). Bu SO sorusuna bakın .
duality_

1
Buradaki ilk cevapta tartışıldı .
duality_

24

Eloquent için şunları yapabilirsiniz:

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

Ancak sorgunuzdan "-> get ()" bölümünü kaldırmanız gerekir.


17

Https://github.com/itsgoingd/clockwork adresindeki Laravel Chrome Chrome Clockwork uzantısını kullanmanızı öneririm . Kurulumu ve kullanımı kolaydır.

Clockwork, PHP geliştirme için bir Chrome uzantısıdır ve Geliştirici Araçlarını, istek, başlıklar, GET ve POST verileri, çerezler, oturum verileri, veritabanı sorguları, veritabanı sorguları, yollar, uygulama çalışma zamanının görselleştirilmesi ve daha fazlası. Clockwork, Laravel 4 ve Slim 2 tabanlı uygulamalar için kullanıma hazır desteği içerir, genişletilebilir bir API aracılığıyla diğer veya özel çerçeveler için destek ekleyebilirsiniz.

resim açıklamasını buraya girin


16

Profil oluşturucu henüz Laravel 4'te olmadığından , üretilen SQL'i görmek için bu yardımcı işlevi oluşturdum:

    genel statik işlev q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = bitiş ($ sorguları);
            return $ last_query;
        }

        $ sorguları döndür;
    }

Not : yalnızca son SQL sorgusu istiyorsanız $ all bayrağı false olarak ayarlayın .

DBH.php (Veritabanı Yardımcısı kısa) adlı bir sınıfta bu tür işlevleri tutmak, böylece böyle bir yerden çağırabilirsiniz:

dd(DBH::q()); 

İşte ben çıktı: resim açıklamasını buraya girin

Merak ediyorsanız, dd () biçimlendirmesi için Kint kullanıyorum. http://raveren.github.io/kint/


1
if($all == false)? Neden olmasınif(!$all)
toesslab


14

İşte ana sayfa şablonunuza atabileceğiniz hızlı bir Javascript snippet'i. Dahil olduğu sürece, tüm sorgular tarayıcınızın Javascript Konsoluna gönderilir. Bunları kolayca okunabilir bir listede yazdırır, böylece sitenize göz atmayı ve her sayfada hangi sorguların yürütüldüğünü görmenizi kolaylaştırır.

Hata ayıklamayı tamamladığınızda şablondan kaldırmanız yeterlidir.

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

Bence {"json_encode ...}} bölümünde" "ihtiyacınız olacak
mydoglixu

@mydoglixu DB::getQueryLog()Bir dizi döndürdüğünden, onu "" ile çevrelemenize gerek yoktur. json_encodebuna göre tercüme edecektir.
rmobis

@mobis - Javascript'in hata atmaması için {{...}} dışında "" seçeneğine ihtiyacınız olduğunu söyledim. bunun gibi: var queries = "json output";
mydoglixu

@ mydoglixu Bir JSON dizisi (veya nesnesi) geçerli bir JavaScript olduğundan, yapmazsınız. Eğer yaparsan kırılacaktı.
rmobis

@mobis - oh evet, duh
mydoglixu

10

Laravel 5

Bu hızlı hata ayıklama için kullandığım prosedürel yaklaşım olduğunu unutmayın

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

başlığınızda şunları kullanın:

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

Çıktı şöyle görünecektir (varsayılan günlük dosyası laravel.log'dur ):

[2015-09-25 12:33:29] test.DEBUG: Sorgu 0: {"sorgu": "'kullanıcılar' arasından * seçin ('user_id' =?)", "Bağlamalar": ["9"] "zaman": 0.23}

*** Bu sorunun Laravel 3/4 belirttiğini biliyorum, ancak bu sayfa genel bir cevap ararken ortaya çıkıyor. Laravel'in yeni başlayanları sürümler arasında bir fark olduğunu bilmiyor olabilir. Ben görmedim beri DD::enableQueryLog()normalde bulmak cevapların hiçbirinde söz, o olabilir belki birileri bu konuda yorum yapabilirsiniz - laravel 5'e spesifik olun.


7

Bunu kullanarak sorgu olaylarını da dinleyebilirsiniz:

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

Dokümanlardan bilgilere bakın burada altında Sorgu Etkinlikleri için Dinleme


6

Sorgu günlüğünü kullanmak, özellikle bağlı değerler varsa, yürütülmekte olan gerçek RAW sorgusunu vermez. Ham sql almak için en iyi yaklaşım budur:

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

veya daha fazla ilgili:

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

5

Laravel 5 kullanıyorsanız, bunu sorgudan önce veya ara katman yazılımına eklemeniz gerekir:

\DB::enableQueryLog();


3

Laravel 4'te aslında veritabanı sorguları için bir Olay Dinleyici kullanabilirsiniz.

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

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

Bu pasajı herhangi bir yere yerleştirin, örneğin start/global.php. Sorguları bilgi günlüğüne ( storage/log/laravel.log) yazar.


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

global.php içine koyun, sql sorgunuzu kaydedecektir.


2

Loic Sharma SQL profiler Laravel 4'ü destekliyor, yeni kurdum. Talimatlar burada listelenmiştir . Adımlar aşağıdaki gibidir:

  1. "loic-sharma/profiler": "1.1.*"Composer.json içindeki istek bölümüne ekleyin
  2. php composer.phar self-updateKonsolda kendi kendine güncelleme => işlevini uygulayın .
  3. php composer.phar update loic-sharma/profilerKonsolda besteci güncellemesi => yapın `
  4. 'Profiler\ProfilerServiceProvider',App.php içindeki sağlayıcı dizisine ekleyin
  5. 'Profiler' => 'Profiler\Facades\Profiler',App.php dosyasındaki takma ad dizisini de ekleyin
  6. php artisan config:publish loic-sharma/profilerKonsolda çalıştır

2

Son sorgu baskısı

$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

Bunu yapmanın başka bir yolu:

#config/database.php

'profiler' => true

Tüm Sorgular sonucu için:

print_r(DB::profiler());

Son Sonuç için:

print_r(DB::last_query());

0

Laravel'de son çalıştırılan sorguyu almak için, çalıştırılan DB::getQueryLog()tüm sorguları döndüren laravel işlevini kullanacağız . Son sorguyu almak için end()son yürütülen sorguyu döndüren işlevi kullanacağız .

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

Http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php adresinden referans aldım .


Cevabınız, Raphael_ tarafından kabul edilen cevabın zaten kapladığı şeye yeni bir bilgi katıyor gibi görünmüyor.
Jaak Kütt

0

Bunu yapmanın çok kolay bir yolu var, laravel sorgunuzdan herhangi bir sütun adını yeniden adlandırın, sorgunuzla ilgili bir hata gösterecektir .. :)


Hızlı hileli yol. Üretimde yararlı değil, geliştirme modunda bazı durumlarda iyi.
bunun yerine
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.