Wykonaj zapytanie w Laravel 3/4


182

Jak mogę pobrać surowo wykonane zapytanie SQL w Laravel 3/4 za pomocą Laravel Query Builder lub Eloquent ORM?

Na przykład coś takiego:

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

Lub:

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

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

W przeciwnym razie, przynajmniej jak mogę zapisać wszystkie zapytania wykonane w laravel.log?


co z laravel 5?
Chaudhry Waqas,

Odpowiedzi:


318

Laravel 4+

W Laravel 4 i późniejszych musisz zadzwonić, DB::getQueryLog()aby uzyskać wszystkie uruchomione zapytania.

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

Lub możesz pobrać pakiet profilera. Polecam barryvdh / laravel-debugbar , co jest całkiem miłe. Możesz przeczytać instrukcje dotyczące instalacji w ich repozytorium .

Uwaga dla użytkowników Laravel 5: Musisz zadzwonić DB::enableQueryLog()przed wykonaniem zapytania. Albo tuż nad linią uruchamiającą zapytanie, albo w oprogramowaniu pośrednim.


Laravel 3

W Laravel 3 możesz uzyskać ostatnie wykonane zapytanie z Eloquentmodelu wywołującego metodę statyczną last_queryw DBklasie.

DB::last_query();

Wymaga to jednak włączenia profileropcji w application/config/database.php. Alternatywnie możesz, jak wspomniano @dualed, włączyć profileropcję, w application/config/application.phplub wywołać, DB::profile()aby wszystkie zapytania były uruchamiane w bieżącym żądaniu i czasie ich wykonywania.


2
Twój kod dla Laravel 4 nie działa. Rozumiem ErrorException: Ostrzeżenie: call_user_func_array()oczekuje, że parametr 1 będzie prawidłowym wywołaniem zwrotnym, klasa Illuminate\Database\MySqlConnectionnie ma metody getQueryList.
duality_

Mój zły, poprawna metoda to getQueryLog. Naprawiono to teraz. Dzięki!
rmobis,

Dziwne ... Dostaję last_query () nie jest zdefiniowany w błędzie obiektu zapytania. Właśnie wzywam do nieautoryzowanego Elokwentnego modelu.
Aditya, poseł

1
W przypadku Laravel 3 jest to w rzeczywistości DB :: last_query (); Musisz także ustawić wartość „profile” na true w swojej aplikacji / config / database.php
Dan Smart

4
To nie wydaje się działać w przypadku elokwentnego modelu na L4. Kiedy wykonuję Model :: find ($ id) i wykonuję DB :: getQueryLog () zwracam pustą tablicę (). Masz pomysł, jak uzyskać zapytania dotyczące elokwentnego modelu?
Abishek

31

Możesz włączyć „ Profiler ” w Laravel 3, ustawiając

'profiler' => true,

W twoim application/config/application.phpiapplication/config/database.php

Umożliwia to pasek na dole każdej strony. Jedną z jego funkcji jest wyświetlenie listy wykonanych zapytań i czasu ich trwania.

wprowadź opis zdjęcia tutaj


14
Zauważ, że w Laravel 4 Profiler nie jest dołączony, musisz go zainstalować samodzielnie (np. Używając kompozytora). Zobacz to SO pytanie .
duality_

1
Jest to omówione w pierwszej odpowiedzi .
duality_

24

W przypadku Eloquent możesz po prostu:

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

Ale musisz usunąć część „-> get ()” z zapytania.


17

Polecam używanie rozszerzenia Chrome Clockwork z pakietem Laravel https://github.com/itsgoingd/clockwork . Jest łatwy w instalacji i obsłudze.

Clockwork to rozszerzenie Chrome do programowania PHP, rozszerzające Narzędzia programistyczne o nowy panel zapewniający wszelkiego rodzaju informacje przydatne do debugowania i profilowania skryptów PHP, w tym informacje na żądanie, nagłówki, dane GET i POST, pliki cookie, dane sesji, zapytania do bazy danych, trasy, wizualizacja środowiska wykonawczego aplikacji i inne. Mechanizm zegarowy obejmuje gotową obsługę aplikacji opartych na Laravel 4 i Slim 2, można dodać obsługę dowolnej innej lub niestandardowej struktury za pomocą rozszerzalnego interfejsu API.

wprowadź opis zdjęcia tutaj


16

Ponieważ profiler nie jest jeszcze dostępny w Laravel 4 , stworzyłem tę funkcję pomocniczą, aby zobaczyć, jak SQL jest generowany:

    publiczna funkcja statyczna q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

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

        zwracaj $ kwerend;
    }

UWAGA : Ustaw flagę $ all na false, jeśli chcesz tylko ostatnie zapytanie SQL.

Trzymam tego rodzaju funkcje w klasie o nazwie DBH.php (skrót od Database Helper), aby móc wywoływać je z dowolnego miejsca takiego jak to:

dd(DBH::q()); 

Oto wynik, który otrzymuję: wprowadź opis zdjęcia tutaj

Jeśli się zastanawiasz, używam Kinta do formatowania dd (). http://raveren.github.io/kint/


1
if($all == false)? Dlaczego nie po prostuif(!$all)
toesslab


14

Oto krótki fragment kodu JavaScript, który możesz wrzucić na szablon strony głównej. Tak długo, jak to jest uwzględnione, wszystkie zapytania będą przesyłane do konsoli Javascript przeglądarki. Drukuje je na łatwej do odczytania liście, ułatwiając przeglądanie witryny i sprawdzanie, jakie zapytania są wykonywane na każdej stronie.

Po zakończeniu debugowania po prostu usuń go z szablonu.

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

Myślę, że potrzebujesz "" wokół części {{json_encode ...}}
mydoglixu

@mydoglixu Ponieważ DB::getQueryLog()zwraca tablicę, nie ma potrzeby otaczania jej znakiem „”. json_encodeprzetłumaczy to odpowiednio.
rmobis

@mobis - Miałem na myśli, że potrzebujesz „” poza {{...}}, aby javascript nie zgłaszał błędu. w ten sposób: var queries = "json output";
mydoglixu

@mydoglixu Nie robisz tego, ponieważ tablica JSON (lub obiekt) jest poprawnym JavaScript. To by się zepsuło, gdybyś to zrobił.
rmobis

@mobis - o tak, duh
mydoglixu

10

Laravel 5

Zauważ, że jest to podejście proceduralne , którego używam do szybkiego debugowania

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

w nagłówku użyj:

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

Dane wyjściowe będą wyglądać mniej więcej tak (domyślny plik dziennika to laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Zapytanie 0: {„query”: „wybierz * z„ users ”gdzie ('user_id' =?)”, „Bindings”: [„9”] , „czas”: 0,23}

*** Wiem, że to pytanie określiło Laravela 3/4, ale ta strona pojawia się, gdy szukasz ogólnej odpowiedzi. Początkujący Laravel mogą nie wiedzieć, że istnieje różnica między wersjami. Ponieważ nigdy nie widzę DD::enableQueryLog()wzmianki w żadnej z odpowiedzi, które zwykle znajduję, może to być specyficzne dla Laravela 5 - być może ktoś może to skomentować.


7

Możesz także nasłuchiwać zdarzeń zapytania za pomocą:

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

Zobacz informacje z dokumentów tutaj w sekcji Słuchanie zdarzeń związanych z zapytaniami


6

Korzystanie z dziennika zapytań nie daje rzeczywistego zapytania RAW, które jest wykonywane, zwłaszcza jeśli istnieją powiązane wartości. To jest najlepsze podejście do uzyskania surowej sql:

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

lub więcej zaangażowanych:

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

5

Jeśli używasz Laravel 5, musisz wstawić to przed zapytaniem lub na oprogramowaniu pośrednim:

\DB::enableQueryLog();


3

w Laravel 4 można faktycznie używać Listener zdarzeń do zapytań do bazy danych.

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

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

Umieść ten fragment w dowolnym miejscu, np start/global.php. W. Wypisze zapytania do dziennika informacji ( storage/log/laravel.log).


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

wstaw go do global.php, aby zarejestrować twoje zapytanie SQL.


2

Profiler Loic Sharma SQL obsługuje Laravel 4, właśnie go zainstalowałem. Instrukcje są wymienione tutaj . Kroki są następujące:

  1. Dodaj "loic-sharma/profiler": "1.1.*"wymaganą sekcję w pliku composer.json
  2. Wykonaj automatyczną aktualizację => php composer.phar self-updatew konsoli.
  3. Wykonaj aktualizację kompozytora => również php composer.phar update loic-sharma/profilerw konsoli `
  4. Dodaj 'Profiler\ProfilerServiceProvider',tablicę dostawcy w app.php
  5. Dodaj 'Profiler' => 'Profiler\Facades\Profiler',także tablicę aliasów w app.php
  6. Uruchom php artisan config:publish loic-sharma/profilerw konsoli

2

Wydruk ostatniego zapytania

$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

Innym sposobem na to jest:

#config/database.php

'profiler' => true

Dla wszystkich wyników zapytania:

print_r(DB::profiler());

Ostatni wynik:

print_r(DB::last_query());

0

Aby uzyskać ostatnie wykonane zapytanie w laravel, użyjemy DB::getQueryLog()funkcji laravel, która zwróci wszystkie wykonane zapytania. Aby uzyskać ostatnie zapytanie, użyjemy end()funkcji, która zwraca ostatnio wykonane zapytanie.

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

Wziąłem odniesienie z http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .


Twoja odpowiedź nie wydaje się wnieść żadnej nowej wiedzy do tego, co obejmuje już zaakceptowana odpowiedź Raphaela_.
Jaak Kütt,

0

Jest to bardzo łatwy sposób, aby to zrobić, z zapytania laravel po prostu zmień nazwę dowolnej nazwy kolumny, wyświetli się błąd w zapytaniu .. :)


Szybki hacky sposób. Nie jest przydatny w produkcji, ale w trybie programowania w niektórych przypadkach jest w porządku.
zamiast
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.