2013-05-02 2 views
17

Wie bekomme ich die rohe SQL-Anweisung von einem Abfrageobjekt in Propel? Ich brauche das zum Debuggen.Propel: Holen Sie sich Raw SQL von Abfrageobjekt?

Zum Beispiel: Ich möchte eine Funktion haben, wie in

$rawSql = new BookQuery::create()->filterById(25)->getRawSql(); 

Ist so etwas gibt es?

Antwort

19

Ja; Sie sind nach der toString Methode aus der Criteria Elternklasse:

$rawSql = (new BookQuery)::create()->filterById(25)->toString(); 

Wie @jakerella sagt, die spezifischen Werte, die Sie für die Filterung verwendet werden von dem Datenbank-Engine gebunden werden, anstatt Propel, und so werden Sie sehen, die Struktur der Abfrage, aber nicht genau, was ausgeführt wird. Wenn Sie dies sehen möchten, können Sie Ihre Datenbankabfrageprotokolle überprüfen, sofern sie aktiviert sind.

+2

So einfach ... :) – twigmac

+2

Beachten Sie, dass keine spezifischen 'select' Spalten in der Abfrage oben erhalten - Propel hat, dass direkt vor dem Fund . Sie müssen also etwas wie folgt sehen: 'SELECT FROM book WHERE id =: p1; ...: p1 => 25' – jakerella

+0

@jakerella: Kannst du das in einer Antwort weiter ausführen? Ich bin mir nicht sicher, ob das klar macht, was zu tun ist. – halfer

8

Antwort akzeptiert erfüllend, das nächste Code danach Abfrageausführung verwenden können.

\Propel::getConnection()->getLastExecutedQuery() // Returns fully qualified SQL 

Es ermöglicht Ihnen, die vollständige Abfrage (einschließlich Spalten auswählen und abgerufenen Parameter), der Datenbank gesendet wurde, um zu sehen.


UPD: (als @bbird von erwähnt)

Dieser Befehl wird nicht ausgegeben, es sei denn, etwas useDebug ist true:

\Propel::getConnection()->useDebug(true); 

UPD2: (wenn Sie Symfony Framework verwenden)

Eine weitere Sache, erwähnenswert ist PropelORM + Symfony.

Wenn Sie SQL verfolgen müssen, ist es möglich, Protokolle zu verwenden. Propel hat seinen eigenen monolog Kanal mit der Bezeichnung propel und vollständig qualifizierte Abfragen werden mit DEBUG Loglevel auf dem relevanten Kanal protokolliert (propel.DEBUG).

Log/Abfrage Datensatz sieht wie folgt aus:

[2016-10-04 17:00:46] propel.DEBUG: time: 0.000 sec | mem: 24.8 MB | connection: default | SELECT `id`, `username`, `email`, `last_login` FROM `users` WHERE `id` = 123 [] [] 
+1

Sehr vielversprechender Vorschlag! Ich freue mich darauf, das auszuprobieren. – twigmac

+2

Beachten Sie, dass dieser Befehl nichts ausgeben wird, solange useDebug nicht true ist: $ con = Propel :: getConnection(); $ conf> useDebug (true); $ conf> getLastExecutedQuery(); – bbird

Verwandte Themen