2009-09-09 9 views
6

Comment puis-je compiler des critères Propel pour effacer SQL? J'ai essayé $ criteria-> toString(); mais ce n'est pas ce à quoi je m'attendais. Aussi j'ai essayé ModelPeer :: doSelectStmt (critères $), mais il est revenu sql brut (substitution de paramètres requis)Comment compiler les critères Propel à SQL

Répondre

2

Je crois que c'est la façon dont

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

Comme je l'ai dit plus tôt, je veux sql clair, pas cru (par exemple «sélectionnez l'article où NAME =: p1 ») Je suppose que Propel fournit cette fonction .. –

+0

dans ce $ rawSql je dois substituer les paramètres: p1,: p2, etc. Mais de cette façon, je dois écrire le code déjà écrit –

+0

Voilà à quoi sert le tableau params. Je suppose que je n'ai pas précisé cela - fournissez vos paramètres en tant que tableau associatif. –

12

Tout d'abord, il est important de noter que Propel utilise PDO avec des instructions préparées, donc vous n'allez pas obtenir une instruction SQL entièrement "construite" en PHP. L'utilisation de Criteria-> toString() est un bon début, mais comme Peter mentionne qu'une grande partie du travail est effectivement effectuée par la méthode BasePeer :: createSelectSql().

Voici la façon la plus complète (de Propel) pour voir ce que le SQL ressemblera (avec des espaces réservés) et les paramètres qui seront substitués dans:

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

Notez que vous pouvez obtenir un meilleur kilométrage de seulement consignation des requêtes au niveau de la base de données. Bien sûr, si PDO est configuré (ou prend en charge) pour utiliser des instructions préparées db natives, vous pouvez toujours voir des espaces réservés dans la base de données.

+0

J'ai ajouté un 'wordwrap ($ sql)' de sorte que sql vraiment long peut tenir sur la page. Je convertissais certaines requêtes Propel en PDO et cela fonctionnait comme un charme. Merci @Hans L. –

0

J'ai décidé de contourner le problème. En fait j'avais besoin du INSERT INTO ... SELECT. I.e - créer SELECT instruction au moyen de critères, ajouter en outre INSERT IN et exécuter.
J'ai donc demandé à BasePeer de créer un SQL brut (BasePeer :: createSelectSql), puis d'ajouter INSERT INTO. Comme j'ai besoin de remplir les valeurs de l'instruction (: p1,: p2, etc), mais la méthode BasePeer :: populateStmtValues ​​ est privée (pourquoi?) J'ai dû copier 'coller cette méthode à un autre endroit et l'appeler.

0

essayer encore plus facile:

print($criteria->toString()) ; 
Questions connexes