Gegeben den folgenden Code:
DB::table('users')->get();
Ich möchte die unformatierte SQL-Abfragezeichenfolge abrufen, die der obige Builder für Datenbankabfragen generiert. In diesem Beispiel wäre es SELECT * FROM users
.
Wie mache ich das?
Gegeben den folgenden Code:
DB::table('users')->get();
Ich möchte die unformatierte SQL-Abfragezeichenfolge abrufen, die der obige Builder für Datenbankabfragen generiert. In diesem Beispiel wäre es SELECT * FROM users
.
Wie mache ich das?
echo User::where('status', 1)->toSql();
Antworten:
Um die zuletzt ausgeführten Abfragen auf dem Bildschirm auszugeben, können Sie Folgendes verwenden:
Ich glaube, die neuesten Abfragen werden am Ende des Arrays angezeigt.
Sie werden so etwas haben:
(Dank Joshuas Kommentar unten.)
quelle
Log
Klasse in das Protokoll Ihrer AnwendungLog::debug(DB::getQueryLog())
DB::enableQueryLog();
DB::enableQueryLog(); dd(DB::getQueryLog());
aber es kehrt nur zurück[]
...DB::connection('database')->getQueryLog()
Verwenden Sie die
toSql()
Methode für eineQueryBuilder
Instanz.DB::table('users')->toSql()
würde zurückkehren:Dies ist einfacher als das Verkabeln eines Ereignis-Listeners. Außerdem können Sie überprüfen, wie die Abfrage zu jedem Zeitpunkt während der Erstellung tatsächlich aussehen wird.
quelle
getBindings
Methode verwenden. Dadurch werden die Bindungen zurückgegeben, damit sie an die SQL-Anweisung gebunden werden.$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
DB::QueryLog()
Arbeiten Sie erst, nachdem Sie die Abfrage ausgeführt haben$builder->get()
. Wenn Sie die Abfrage erhalten möchten, bevor Sie die Abfrage ausführen, können Sie die$builder->toSql()
Methode verwenden. Dies ist das Beispiel, wie Sie die SQL erhalten und binden:ODER machen Sie einfach Ihren Abfragefehler wie das Aufrufen einer nicht vorhandenen Tabelle oder Spalte. In Ausnahme XD wird die generierte Abfrage angezeigt
quelle
$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
LIKE
Abfrage oder beim Formatieren von Daten. Sie müssen diesen zuerst mit doppelten Prozentzeichen entkommen.$builder->getBindings()
?Sie können das Ereignis 'illuminate.query' anhören. Fügen Sie vor der Abfrage den folgenden Ereignis-Listener hinzu:
Dies wird etwas ausdrucken wie:
quelle
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Event;
kannst du es einfach machen,use Event;
da es eine Fassade ist .Wenn Sie versuchen, das Protokoll mit Illuminate ohne Laravel abzurufen, verwenden Sie:
Sie können auch eine schnelle Funktion wie folgt aktivieren:
BEARBEITEN
In aktualisierten Versionen scheint die Abfrageprotokollierung standardmäßig deaktiviert zu sein (oben wird ein leeres Array zurückgegeben). Um sich beim Initialisieren des Capsule Managers wieder einzuschalten, greifen Sie auf eine Instanz der Verbindung zu und rufen Sie die
enableQueryLog
Methode aufWIEDER BEARBEITEN
Unter Berücksichtigung der eigentlichen Frage können Sie Folgendes tun, um die aktuelle Einzelabfrage anstelle aller vorherigen Abfragen zu konvertieren:
quelle
'US/Eastern'
.quick function
. Ich glaube, dass der zugrunde liegende Code Vorbereitungsmethoden ( php.net/manual/en/mysqli.prepare.php ) verwenden wird, weshalb nur die?
erforderlich sind. Sie können php.net/manual/en/function.is-numeric.php verwenden , um zu bestimmen, ob die Eingabe in einfache Anführungszeichen eingeschlossen werden soll oder nicht.is_numeric
Idee aufzunehmen), und sie funktioniert! Ich liebe es. Vielen Dank.In eloquent gibt es eine Methode zum Abrufen von Abfragezeichenfolgen.
toSql ()
in unserem Fall,
Rückkehr
ist die genaue Lösung, die die SQL-Abfragezeichenfolge zurückgibt.
quelle
->where('foo', '=', 'bar')
Bar nicht in der SQL zeigenquelle
->toSql()
, wenn nach dem Modell weitere Argumente vorhanden sind. zBUser::where('id', 1)->toSql()
Wenn Sie Laravel 5.1 und MySQL verwenden, können Sie diese von mir erstellte Funktion verwenden:
Als Eingabeparameter können Sie einen dieser Parameter verwenden
quelle
Zuerst müssen Sie das Abfrageprotokoll aktivieren, indem Sie Folgendes aufrufen:
Nach Abfragen über die DB-Fassade können Sie schreiben:
Die Ausgabe wird wie folgt aussehen:
quelle
Dies ist die weitaus beste Lösung, die ich jedem empfehlen kann, um beredte letzte oder letzte Abfragen zu debuggen, obwohl dies ebenfalls diskutiert wurde:
quelle
Erster Weg:
Einfach können Sie folgende Dinge mit
toSql()
Methode tun ,Wenn es nicht funktioniert, können Sie das Ding aus der Laravel-Dokumentation einrichten .
Zweiter Weg:
Ein anderer Weg ist es
DB::getQueryLog()
aber wenn es ein leeres Array zurück dann standardmäßig ist es deaktiviert Besuch dieses ,
einfach aktivieren mit
DB::enableQueryLog()
und es wird funktionieren :)Weitere Informationen finden Sie in der Github- Ausgabe , um mehr darüber zu erfahren.
Ich hoffe es hilft :)
quelle
Ein 'makroable' Ersatz, um die SQL-Abfrage mit den Bindungen zu erhalten.
Fügen Sie unten die Makrofunktion in der Methode hinzu.
AppServiceProvider
boot()
Fügen Sie einen Alias für den Eloquent Builder hinzu. ( Laravel 5.4+ )
Dann wie gewohnt debuggen. ( Laravel 5.4+ )
ZB Query Builder
ZB Eloquent Builder
ZB Eloquent Builder ( Laravel 5.1 - 5.3 )
quelle
Verwenden Sie das Debugbar-Paket
quelle
Ab Laravel
5.2
und weiter. Sie können verwendenDB::listen
, um ausgeführte Abfragen zu erhalten.Wenn Sie eine einzelne
Builder
Instanz debuggen möchten, können Sie dietoSql
Methode verwenden.quelle
Am einfachsten ist es, absichtliche Fehler zu machen . Zum Beispiel möchte ich die vollständige SQL-Abfrage der folgenden Beziehung sehen:
Ich möchte nur eine Spalte erstellen, die nicht gefunden wird. Hier wähle ich sie aus
created_at
und ändere siecreated_ats
durch Hinzufügen von Trailings
zu:Der Debuger gibt also den folgenden Fehler zurück:
Die obige Fehlermeldung gibt die vollständige SQL-Abfrage mit dem Fehler zurück
Entfernen Sie jetzt einfach das Extra
s
aus created_at und testen Sie dieses SQL, wie Sie möchten, in einem beliebigen SQL-Editor wie dem phpMyAdmin SQL-Editor!quelle
:id
Verwenden Sie das Laravel-Abfrageprotokoll, um die ausgeführte Laravel-Abfrage anzuzeigen
quelle
Ab Laravel 5.8.15 der Query Builder jetzt hat
dd
unddump
Methoden so können Sie tunquelle
Dies ist die Funktion, die ich in meine Basismodellklasse eingefügt habe. Übergeben Sie einfach das Query Builder-Objekt und die SQL-Zeichenfolge wird zurückgegeben.
quelle
Meiner Meinung nach ist dies der beste Ansatz für Anfänger:
Dies ist auch hier dargestellt. https://stackoverflow.com/a/59207557/9573341
quelle
Für Laravel 5.5.X.
Wenn Sie jede von Ihrer Anwendung ausgeführte SQL-Abfrage erhalten möchten, können Sie die Listen-Methode verwenden. Diese Methode ist nützlich zum Protokollieren von Abfragen oder zum Debuggen. Sie können Ihren Abfrage-Listener bei einem Dienstanbieter registrieren:
Quelle
quelle
Fügen Sie diese Funktion Ihrer Anwendung hinzu und rufen Sie einfach an.
Ausgabe : " Wählen Sie * aus,
user
wobeilang
= 'en' undstatus
= '1' nachupdated_at
absteigender Grenze 25 Offset 0 sortieren."quelle
Mit diesem Paket können Sie alle Abfragen abrufen, die beim Laden Ihrer Seite ausgeführt werden
quelle
Letzte Abfrage drucken
quelle
Wenn Sie nicht Laravel verwenden, sondern das Eloquent-Paket verwenden, dann:
quelle
Sie können Uhrwerk verwenden
funktioniert aber auch in Firefox
quelle
Ich habe einige einfache Funktionen erstellt, um SQL und Bindungen aus einigen Abfragen abzurufen.
Verwendungszweck:
quelle
So sehr ich diesen Rahmen liebe, ich hasse es, wenn er sich wie Mist verhält.
DB::enableQueryLog()
ist völlig nutzlos.DB::listen
ist ebenso nutzlos. Es zeigte einen Teil der Abfrage, als ich sagte$query->count()
, aber wenn ich es tue$query->get()
, hat es nichts zu sagen.Die einzige Lösung, die konsistent zu funktionieren scheint, besteht darin, absichtlich eine Syntax oder einen anderen Fehler in die ORM-Parameter einzufügen, z. B. einen nicht vorhandenen Spalten- / Tabellennamen, Ihren Code im Debug-Modus in der Befehlszeile auszuführen und den SQL-Fehler auszuspucken mit der vollen verdammten Abfrage endlich. Andernfalls wird der Fehler hoffentlich in der Protokolldatei angezeigt, wenn er vom Webserver ausgeführt wird.
quelle
Wenn Sie Tinker verwenden und die erstellte SQL-Abfrage protokollieren möchten, können Sie dies tun
quelle
Versuche dies:
Hinweis: get () wurde durch toSql () ersetzt, um die unformatierte SQL-Abfrage anzuzeigen.
quelle
Meine Vorgehensweise, basierend auf der Protokollansicht, muss nur die Datei ändern
app/Providers/AppServiceProvider.php
:app/Providers/AppServiceProvider.php
storage/logs/laravel-2019-10-27.log
:quelle