2013-05-02 2 views
17

Как получить исходный оператор SQL из объекта запроса в Propel? Мне нужно это для целей отладки.Propel: получить Raw SQL из объекта Query?

Например: Я хотел бы иметь функцию, как в

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

Существует ли что-то подобное?

ответ

19

Да; вы после toString метода из Criteria родительского класса:

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

Как @jakerella говорит, конкретные значения, которые вы используете для фильтрации будет связано ядро ​​базы данных, а не Propel, и поэтому вы увидите структура запроса, но не совсем то, что будет выполнено. Если вы хотите это увидеть, вы можете проверить журналы запросов базы данных, если они включены.

+2

Так просто ... :) – twigmac

+2

Обратите внимание, что вы не получите конкретные 'select' столбцы в приведенном выше запросе - Propel делает это прямо перед находкой , Таким образом, вы должны увидеть что-то вроде: 'SELECT FROM book WHERE id =: p1; ...: p1 => 25' – jakerella

+0

@jakerella: можете ли вы расширить это в ответ? Я не уверен, что дает понять, как делать то, что вы предлагаете. – halfer

8

Исполняя принял ответ, вы можете использовать следующий код после этого выполнения запроса.

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

Это позволяет увидеть полного запрос (включая некоторые столбцы и принесенные параметры), который был отправлен в базу данных.


UPD: (как было упомянуто @bbird)

Эта команда не выводит ничего, если useDebug не true:

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

UP D2: (, если вы используете Symfony рамки)

Еще одна вещь стоит упомянуть PropelORM + Symfony.

Если вам нужно отслеживать SQL, это возможно с помощью журналов. Propel имеет собственный канал monolog под названием propel, а полные запросы регистрируются с помощью DEBUG уровня журнала на соответствующем канале ().

Log записи/запроса выглядит следующим образом:

[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

Очень перспективное предложение! Я с нетерпением жду этого. – twigmac

+2

Обратите внимание: эта команда ничего не выводит, если useDebug не прав: $ con = Propel :: getConnection(); $ Con-> useDebug (истина); $ Con-> getLastExecutedQuery(); – bbird