2009-09-09 7 views
6

Wie kann ich Propel-Kriterien kompilieren, um SQL zu löschen? Ich habe versucht, $ criteria-> toString(); aber das ist nicht zu erwarten. Auch habe ich versucht, ModelPeer :: doSelectStmt ($ Kriterien), aber es roh SQL zurückgegeben (erforderliche Parameter Substitution)So kompilieren Sie Propel-Kriterien nach SQL

Antwort

2

Ich glaube, dies ist der Weg

$rawSql = BasePeer::createSelectSql($criteria, $params); 
+0

Wie ich bereits sagte ich klar SQL erhalten möchten, nicht roh (wie „wählen Sie aus Artikel, in dem NAME =: p1“) Ich denke, Propel solche Funktion bietet .. . –

+0

in diesem $ rawSql Ich muss Parameter ersetzen: p1,: p2, etc. Aber auf diese Weise muss ich bereits geschriebenen Code schreiben –

+0

Dafür ist das params-Array. Ich schätze, ich habe das nicht klargestellt - versorge deine Params als assoziatives Array. –

12

Zunächst einmal ist, ist es wichtig zu beachten, dass Propel verwendet PDO mit vorbereiteten Anweisungen, sodass Sie keine vollständig "eingebaute" SQL-Anweisung in PHP erhalten. Die Verwendung von Criteria-> toString() ist ein guter Anfang, aber wie Peter erwähnt, wird ein Großteil der Arbeit tatsächlich von der BasePeer :: createSelectSql() -Methode erledigt.

Hier ist die vollständigste Weg (von Propel), um zu sehen, was die SQL aussehen wird (mit Platzhalter) und die Parameter, die in ersetzt wird:

$params = array(); // This will be filled with the parameters 
$sql = BasePeer::createSelectSql($criteria, $params); 

print "The raw SQL: " . $sql . "\n"; 
print "The parameters: " . print_r($params, true) . "\n"; 

Beachten Sie, dass Sie nur bessere Kilometerleistung erhalten kann Protokollieren der Abfragen auf Datenbankebene. Natürlich, wenn PDO konfiguriert ist (oder unterstützt), native db prepared Anweisungen zu verwenden, dann sehen Sie vielleicht immer noch Platzhalter in der db.

+0

Ich fügte ein 'wordwrap ($ sql)' so wirklich lange sql kann auf die Seite passen. Ich habe einige Propel-Anfragen zurück in PDO umgewandelt, und das funktionierte wie ein Zauber. Danke @Hans L. –

0

Ich entschied mich, um zu arbeiten. Eigentlich brauchte ich die INSERT INTO ... SELECT. Ie - create SELECT Anweisung mittels Kriterien, weiter anhängen INSERT INTO und ausführen.
So fragte ich BasePeer, um rohe SQL (BasePeer :: createSelectSql) zu erstellen, dann INSERT IN voran gestellt. Da ich die Werte der Anweisung ausfüllen muss (: p1,: p2, usw.), aber Methode BasePeer :: populateStmtValues ​​ ist privat (warum?) Ich musste diese Methode an einen anderen Ort kopieren und aufrufen.

0

Noch einfacher Versuch:

print($criteria->toString()) ; 
Verwandte Themen