Lassen Sie die Abfrage in Laravel 3/4 ausführen


182

Wie kann ich die roh ausgeführte SQL-Abfrage in Laravel 3/4 mit Laravel Query Builder oder Eloquent ORM abrufen?

Zum Beispiel so etwas:

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

Oder:

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

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

Wie kann ich sonst zumindest alle in laravel.log ausgeführten Abfragen speichern?


Was ist mit Laravel 5?
Chaudhry Waqas

Antworten:


318

Laravel 4+

In Laravel 4 und höher müssen Sie anrufen DB::getQueryLog(), um alle ausgeführten Abfragen zu erhalten.

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

Oder Sie können ein Profiler-Paket herunterladen. Ich würde barryvdh / laravel-debugbar empfehlen , was ziemlich ordentlich ist. Anweisungen zur Installation in ihrem Repository finden Sie hier .

Hinweis für Laravel 5-Benutzer: Sie müssen anrufen, DB::enableQueryLog()bevor Sie die Abfrage ausführen. Entweder direkt über der Zeile, in der die Abfrage ausgeführt wird, oder in einer Middleware.


Laravel 3

In Laravel 3 können Sie die zuletzt ausgeführte Abfrage von einem EloquentModell abrufen, das die statische Methode last_queryfür die DBKlasse aufruft .

DB::last_query();

Dies setzt jedoch voraus, dass Sie die profilerOption in aktivieren application/config/database.php. Alternativ können Sie, wie @dualed erwähnt, die profilerOption in aktivieren application/config/application.phpoder aufrufen DB::profile(), um alle Abfragen in der aktuellen Anforderung und deren Ausführungszeit auszuführen .


2
Ihr Code für Laravel 4 funktioniert nicht. Ich erhalte Folgendes ErrorException: Warnung: call_user_func_array()erwartet, dass Parameter 1 ein gültiger Rückruf ist, Klasse Illuminate\Database\MySqlConnectionhat keine Methode getQueryList.
Dualität_

Meine schlechte, die richtige Methode ist getQueryLog. Es wurde jetzt behoben. Vielen Dank!
Rmobis

Seltsam ... Ich erhalte last_query () ist im Abfrageobjektfehler nicht definiert. Ich rufe nur ein unbegründetes eloquentes Modell an.
Aditya MP

1
Für Laravel 3 ist es tatsächlich DB :: last_query (); Sie müssen auch 'Profil' in Ihrer Anwendung / config / database.php
Dan Smart

4
Dies scheint für ein eloquentes Modell auf L4 nicht zu funktionieren. Wenn ich Model :: find ($ id) ausführe und DB :: getQueryLog () ausführe, gebe ich ein leeres Array () zurück. Haben Sie eine Idee, wie Sie die Abfragen für ein eloquentes Modell erhalten können?
Abishek

31

Sie können den " Profiler " in Laravel 3 durch Einstellen aktivieren

'profiler' => true,

In deinem application/config/application.phpundapplication/config/database.php

Dies aktiviert eine Leiste am unteren Rand jeder Seite. Eine seiner Funktionen ist das Auflisten der ausgeführten Abfragen und wie lange sie jeweils gedauert haben.

Geben Sie hier die Bildbeschreibung ein


14
Beachten Sie, dass in Laravel 4 der Profiler nicht enthalten ist. Sie müssen ihn selbst installieren (z. B. mit Composer). Siehe diese SO-Frage .
Dualität_

1
Es wird in der ersten Antwort dort besprochen .
Dualität_

24

Für Eloquent können Sie einfach Folgendes tun:

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

Sie müssen jedoch den Teil "-> get ()" aus Ihrer Abfrage entfernen.


17

Ich würde empfehlen, die Chrome-Erweiterung Clockwork mit dem Laravel-Paket https://github.com/itsgoingd/clockwork zu verwenden . Es ist einfach zu installieren und zu verwenden.

Clockwork ist eine Chrome-Erweiterung für die PHP-Entwicklung, die die Entwicklertools um ein neues Bedienfeld erweitert, das alle Arten von Informationen enthält, die zum Debuggen und Profilieren Ihrer PHP-Skripte nützlich sind, einschließlich Informationen zu Anforderungen, Headern, GET- und POST-Daten, Cookies, Sitzungsdaten, Datenbankabfragen, Routen, Visualisierung der Anwendungslaufzeit und mehr. Clockwork bietet sofort Unterstützung für Laravel 4- und Slim 2-basierte Anwendungen. Sie können Unterstützung für jedes andere oder benutzerdefinierte Framework über eine erweiterbare API hinzufügen.

Geben Sie hier die Bildbeschreibung ein


16

Da der Profiler in Laravel 4 noch nicht verfügbar ist , habe ich diese Hilfsfunktion erstellt, um zu sehen, wie SQL generiert wird:

    öffentliche statische Funktion q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

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

        $ Abfragen zurückgeben;
    }}

HINWEIS : Setzen Sie das Flag $ all auf false, wenn Sie nur die letzte SQL-Abfrage wünschen.

Ich behalte diese Art von Funktionen in einer Klasse namens DBH.php (kurz für Database Helper), damit ich sie von überall wie folgt aufrufen kann:

dd(DBH::q()); 

Hier ist die Ausgabe, die ich bekomme: Geben Sie hier die Bildbeschreibung ein

Falls Sie sich fragen, verwende ich Kint für die Formatierung von dd (). http://raveren.github.io/kint/


1
if($all == false)? Warum nicht einfachif(!$all)
Toesslab


14

Hier ist ein kurzer Javascript-Ausschnitt, den Sie auf Ihre Masterseitenvorlage werfen können. Solange es enthalten ist, werden alle Abfragen an die Javascript-Konsole Ihres Browsers ausgegeben. Sie werden in einer leicht lesbaren Liste gedruckt, sodass Sie ganz einfach auf Ihrer Website stöbern und sehen können, welche Abfragen auf jeder Seite ausgeführt werden.

Wenn Sie mit dem Debuggen fertig sind, entfernen Sie es einfach aus Ihrer Vorlage.

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

Ich denke, Sie würden "" um den {{json_encode ...}} Teil
brauchen

@mydoglixu Da DB::getQueryLog()ein Array zurückgegeben wird, muss es nicht mit "" umgeben werden. json_encodewird es entsprechend übersetzen.
RMOBIS

@mobis - Ich meinte, dass Sie das "" außerhalb von {{...}} benötigen, damit Javascript keinen Fehler auslöst. wie folgt: var queries = "json output";
Mydoglixu

@mydoglixu Das tun Sie nicht, da ein JSON-Array (oder Objekt) gültiges JavaScript ist. Es würde brechen, wenn du es tust.
Rmobis

@mobis - oh yeah,
duh

10

Laravel 5

Beachten Sie, dass dies der prozedurale Ansatz ist, den ich für das schnelle Debuggen verwende

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

Verwenden Sie in Ihrem Header:

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

Die Ausgabe sieht ungefähr so aus (Standardprotokolldatei ist laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Abfrage 0: {"Abfrage": "Wählen Sie * aus 'Benutzern' aus, wobei ('Benutzer_ID' =?)", "Bindungen": ["9"] , "Zeit": 0,23}

*** Ich weiß, dass diese Frage Laravel 3/4 angegeben hat, aber diese Seite wird angezeigt, wenn nach einer allgemeinen Antwort gesucht wird. Neulinge in Laravel wissen möglicherweise nicht, dass es einen Unterschied zwischen den Versionen gibt. Da ich DD::enableQueryLog()in keiner der Antworten, die ich normalerweise finde, erwähnt werde, kann es spezifisch für Laravel 5 sein - vielleicht kann jemand dies kommentieren.


7

Sie können auch auf Abfrageereignisse warten, indem Sie Folgendes verwenden:

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

Informationen finden Sie in den Dokumenten hier unter Abhören von Abfrageereignissen


6

Wenn Sie das Abfrageprotokoll verwenden, erhalten Sie nicht die tatsächlich ausgeführte RAW-Abfrage, insbesondere wenn gebundene Werte vorhanden sind. Dies ist der beste Ansatz, um die rohe SQL zu erhalten:

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

oder mehr beteiligt:

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

5

Wenn Sie Laravel 5 verwenden, müssen Sie dies vor der Abfrage oder in der Middleware einfügen:

\DB::enableQueryLog();


3

In Laravel 4 können Sie einen Ereignis-Listener für Datenbankabfragen verwenden.

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

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

Platzieren Sie dieses Snippet an einer beliebigen Stelle, z start/global.php. Die Abfragen werden in das Info-Protokoll ( storage/log/laravel.log) geschrieben.


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

Wenn Sie es in die Datei global.php einfügen, wird Ihre SQL-Abfrage protokolliert.


2

Der Loic Sharma SQL Profiler unterstützt Laravel 4, ich habe es gerade installiert. Die Anweisungen sind hier aufgeführt . Die Schritte sind die folgenden:

  1. Fügen Sie "loic-sharma/profiler": "1.1.*"den erforderlichen Abschnitt in composer.json hinzu
  2. Führen Sie ein Selbstupdate => php composer.phar self-updatein der Konsole durch.
  3. Führen Sie das Composer-Update => auch php composer.phar update loic-sharma/profilerin der Konsole durch `
  4. Fügen Sie 'Profiler\ProfilerServiceProvider',das Provider-Array in app.php hinzu
  5. Fügen Sie 'Profiler' => 'Profiler\Facades\Profiler',das Aliasse-Array auch in app.php hinzu
  6. Führen Sie php artisan config:publish loic-sharma/profilerin der Konsole aus

2

Letzter Abfragedruck

$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

Ein anderer Weg, dies zu tun, ist:

#config/database.php

'profiler' => true

Für alle Abfragen Ergebnis:

print_r(DB::profiler());

Für das letzte Ergebnis:

print_r(DB::last_query());

0

Um die zuletzt ausgeführte Abfrage in Laravel zu erhalten, verwenden wir die DB::getQueryLog()Funktion von Laravel, die alle ausgeführten Abfragen zurückgibt. Um die letzte Abfrage zu erhalten, verwenden wir eine end()Funktion, die die zuletzt ausgeführte Abfrage zurückgibt.

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

Ich habe auf http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php verwiesen .


Ihre Antwort scheint kein neues Wissen zu dem beizutragen, was die akzeptierte Antwort von Raphael_ bereits abdeckt.
Jaak Kütt

0

Es gibt eine sehr einfache Möglichkeit, dies zu tun. Wenn Sie in Ihrer Laravel-Abfrage einfach einen beliebigen Spaltennamen umbenennen, wird ein Fehler bei Ihrer Abfrage angezeigt. :)


Schneller hackiger Weg. In der Produktion nicht zu nützlich, aber im Entwicklungsmodus ist es in einigen Fällen in Ordnung.
Stattdessen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.