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
Wierzę, że to jest droga
$rawSql = BasePeer::createSelectSql($criteria, $params);
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.
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. –
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ą.
Ostatnio mieliśmy ten sam problem. Zobacz: http://groups.google.com/group/propel-development/browse_thread/thread/f56a5a8ee5db3b60
Teraz BasePeer :: populateStmtValues () jest publicznie dostępny od wersji 1.4 napędu. To jest obecnie w dev.
Nawet łatwiej try:
print($criteria->toString()) ;
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ę .. –
w tym $ rawSql muszę podstawić parametry: p1,: p2, itp. Ale w ten sposób muszę napisać już napisany kod –
Do tego służy tablica parametrów. Sądzę, że nie wyjaśniłem tego jasno - podaj swoje parametry jako tablicę asocjacyjną. –