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?

Patrick Maciel
źródło
co z laravel 5?
Chaudhry Waqas,
@Adamnick tutaj: stackoverflow.com/questions/27753868/...
Patrick Maciel

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.

rmobis
źródło
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

podwójny
źródło
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.

JamesPlayer
źródło
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

Znarkus
źródło
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/

Ricardo Rossi
źródło
1
if($all == false)? Dlaczego nie po prostuif(!$all)
toesslab
14

W przypadku Laraver 4 jest to

DB::getQueryLog()
misaizdaleka
źródło
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>
Adam
źródło
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ć.

Bryan
źródło
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

Migawka
źródło
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);
omar j
źródło
5

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

\DB::enableQueryLog();
Mandeep Gill
źródło
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).

Aebersold
źródło
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.

Christland
źródło
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
rower
źródło
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);
Dulitha Kumarasiri
źródło
1

Jednowarstwowy L4

(które zapisują zapytanie):

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

Kamil Kiełczewski
źródło
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());
Wallace Maxters
źródło
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 .

Manish
źródło
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 .. :)

Aamir
źródło
Szybki hacky sposób. Nie jest przydatny w produkcji, ale w trybie programowania w niektórych przypadkach jest w porządku.
zamiast