2009-09-09 11 views
6

Come posso compilare i criteri di propulsione per cancellare SQL? Ho provato $ criteria-> toString(); ma questo non è quello che mi aspettavo. Anche io ho provato ModelPeer :: doSelectStmt ($ criteri), ma restituiti SQL prime (parametri richiesti sostituzione)Come compilare i criteri di propulsione su SQL

risposta

2

Credo che questo sia il modo in cui

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

come ho detto prima voglio ottenere SQL chiaro, non prima (come ad esempio "selezionare articolo dove NAME = p1") Credo Propel fornisce tale caratteristica .. –

+0

in quel $ rawSql devo sostituire i parametri: p1,: p2, ecc. Ma in questo modo devo scrivere codice già scritto –

+0

Ecco a cosa serve l'array params. Immagino di non averlo chiarito: fornire i params come array associativo. –

12

Prima di tutto, è importante notare che Propel utilizza PDO con istruzioni preparate, quindi non si otterrà un'istruzione SQL completamente "built-out" in PHP. Usare Criteria-> toString() è un buon inizio, ma siccome Peter menziona molto del lavoro è fatto dal metodo BasePeer :: createSelectSql().

Ecco il modo più completo (da Propel) per vedere ciò che lo SQL sarà simile (con segnaposti) ed i parametri che verranno sostituiti in:

$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"; 

Nota che si può ottenere una migliore distanza in miglia da solo registrando le query a livello di database. Naturalmente, se PDO è configurato (o supporta) per utilizzare istruzioni native db preparate, allora si possono ancora vedere segnaposti anche nel db.

+0

Ho aggiunto un 'wordwrap ($ sql)' in modo che sql molto lungo possa adattarsi alla pagina. Stavo convertendo alcune query di Propel su PDO e questo ha funzionato come un fascino. Grazie @Hans L. –

0

Ho deciso di lavorare. In realtà avevo bisogno del INSERT INTO ... SELECT. I.e - crea SELEZIONA la dichiarazione con i criteri, aggiungi inoltre INSERISCI IN ed esegui.
Quindi ho chiesto a BasePeer di creare sql raw (BasePeer :: createSelectSql), quindi aggiunto INSERT IN avanti. Dato che ho bisogno di inserire i valori dell'istruzione (: p1,: p2, ecc.), Ma il metodo BasePeer :: populateStmtValues ​​ è privato (perché?) Ho dovuto copiare il metodo in un altro posto e chiamarlo.

0

prova Ancora più facile:

print($criteria->toString()) ; 
Problemi correlati