2009-09-09 10 views
6

Jak mogę skompilować Kryteria Propel, aby wyczyścić SQL? Próbowałem $ criteria-> toString(); ale tego się nie spodziewałem. Również próbowałem ModelPeer :: doSelectStmt ($ kryteria), ale powrócił surowego sql (wymagane parametry zastępcze)Jak skompilować Kryteria Propel do SQL

Odpowiedz

2

Wierzę, że to jest droga

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

Jak powiedziałem wcześniej, chcę uzyskać jasną SQL, nie surowy (takich jak „wybrać z artykułem gdzie NAME =: P1”) Chyba Propel udostępnia taką funkcję .. –

+0

w tym $ rawSql muszę podstawić parametry: p1,: p2, itp. Ale w ten sposób muszę napisać już napisany kod –

+0

Do tego służy tablica parametrów. Sądzę, że nie wyjaśniłem tego jasno - podaj swoje parametry jako tablicę asocjacyjną. –

12

Przede wszystkim ważne jest, aby pamiętać, że Propel używa PDO z przygotowanymi instrukcjami, więc nie otrzymasz w pełni "wbudowanego" polecenia SQL w PHP. Korzystanie z Criteria-> toString() jest dobrym początkiem, ale jak wspomina Peter, wiele prac jest rzeczywiście wykonywanych przez metodę BasePeer :: createSelectSql().

Oto najbardziej kompletny sposób (z Propel), aby zobaczyć, co SQL będzie wyglądać (zastępcze), a parametry, które zostaną podstawione w:

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

Zauważ, że można uzyskać lepszy przebieg już od logowanie zapytań na poziomie bazy danych. Oczywiście, jeśli PDO jest skonfigurowany (lub obsługuje) do korzystania z natywnych przygotowanych instrukcji db, to nadal możesz zobaczyć symbole zastępcze w db.

+0

Dodałem 'wordwrap ($ sql)' tak naprawdę długi sql może zmieścić się na stronie. Zamieniłem kilka zapytań Propela z powrotem na PDO i działało to jak czar. Dzięki @Hans L. –

0

Postanowiłem pracować. Właściwie potrzebowałem INSERT INTO ... SELECT. I.e - Utwórz oświadczenie SELECT za pomocą Kryteriów, dodatkowo dołącz INSERT INTO i wykonaj.
Więc poprosiłem BasePeer, aby utworzył surowy sql (BasePeer :: createSelectSql), a następnie dodał INSERT INTO. Ponieważ potrzebuję wartości wypełnienia oświadczenia (: p1,: p2, itp.), Ale metoda BasePeer :: populateStmtValues ​​ jest prywatna (dlaczego?) Musiałem skopiować 'wklej tę metodę do innego miejsca i wywołać ją.

0

Nawet łatwiej try:

print($criteria->toString()) ; 
Powiązane problemy