2013-05-02 14 views
17

Jak uzyskać surową instrukcję SQL z obiektu zapytania w Propelu? Potrzebuję tego do celów debugowania.Propel: Uzyskaj surowy SQL z obiektu zapytania?

Na przykład: Chciałbym mieć funkcję w

$rawSql = new BookQuery::create()->filterById(25)->getRawSql(); 

Czy coś takiego istnieje?

Odpowiedz

19

Tak; jesteś po metody z klasy Criteria dominującej toString:

$rawSql = (new BookQuery)::create()->filterById(25)->toString(); 

Jak @jakerella mówi, szczególne wartości użyć do filtrowania będzie związany przez silnik bazy danych, zamiast Propelu, a więc zobaczymy struktura zapytania, ale nie dokładnie to, co zostanie wykonane. Jeśli chcesz to zobaczyć, możesz sprawdzić dzienniki zapytań do bazy danych, jeśli są włączone.

+2

Tak prosty ... :) – twigmac

+2

pamiętać, że nie dostanie konkretnych 'kolumny select' w zapytaniu powyżej - Propel robi tuż przed znalezisku . Tak więc musisz zobaczyć coś takiego: 'WYBIERZ Z książki WHERE id =: p1; ...: p1 => 25' – jakerella

+0

@jakerella: czy możesz rozwinąć to w odpowiedzi? Nie jestem pewien, czy to wyjaśnia, jak robić to, co sugerujesz. – halfer

8

wypełnianiu zaakceptowane odpowiedź, można użyć kolejnego kodu potem wykonanie zapytania.

\Propel::getConnection()->getLastExecutedQuery() // Returns fully qualified SQL 

Pozwala zobaczyć pełną kwerendę (tym wybranych kolumn i parametrach idących), który został wysłany do bazy .


UPD (jak wspomniano przez @bbird)

Polecenie to nie będzie wyjścia coś chyba useDebug jest true:

\Propel::getConnection()->useDebug(true); 

UPD2: (jeśli używasz Symfony ramy)

jeszcze jedno warto wspomnieć, jest PropelORM + Symfony.

Aby prześledzić SQL, można użyć dzienników. Propel ma swój własny kanał monolog o nazwie propel, a w pełni kwalifikowane zapytania są rejestrowane na poziomie dziennika DEBUG na odpowiednim kanale (propel.DEBUG).

Log zapis/kwerendy wygląda następująco:

[2016-10-04 17:00:46] propel.DEBUG: time: 0.000 sec | mem: 24.8 MB | connection: default | SELECT `id`, `username`, `email`, `last_login` FROM `users` WHERE `id` = 123 [] [] 
+1

Bardzo obiecująca propozycja! Nie mogę się doczekać wypróbowania tego. – twigmac

+2

Uwaga: to polecenie nie wypisze niczego, chyba że useDebug ma wartość true: $ con = Propel :: getConnection(); $ con> useDebug (true); $ con> getLastExecutedQuery(); – bbird