2013-05-02 38 views
17

如何從Propel中的查詢對象中獲取原始SQL語句?我需要這個用於調試目的。推進:從查詢對象獲取原始SQL?

例如:我想有一個函數在

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

難道這樣的事情存在嗎?

回答

19

是;你是從Criteria父類的方法toString後:

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

由於@jakerella說,您用來過濾的具體數值將由數據庫引擎的約束,而不是行走,所以你會看到查詢的結構,但不完全是將執行的內容。如果你想看,那麼你可以檢查你的數據庫查詢日誌,如果它們被啓用。

+2

這麼簡單... :) – twigmac 2013-05-02 14:16:20

+2

請注意,你不會在上面的查詢得到具體的'select'列 - 行走確實是正確的查找之前。因此,您必須看到如下所示的內容:'SELECT FROM book WHERE id =:p1; ...:p1 => 25' – jakerella 2013-05-02 15:28:53

+0

@jakerella:你可以在答案中擴展它嗎?我不確定這是否清楚如何去做你的建議。 – halfer 2013-05-02 15:33:04

8

履行接受的答案,您可以使用下一個代碼之後查詢執行。

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

它可以讓你看到完整的查詢包括選擇列和獲取參數),將其發送到數據庫。


UPD:(如通過提到@bbird

此命令不會輸出任何東西,除非useDebugtrue

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

UPD2:(如果您正在使用Symfony框架

還有一兩件事值得一提的是PropelORM + 的Symfony

如果您需要跟蹤SQL,可以使用日誌。推進有它自己的monolog通道稱爲propel和完全合格的查詢記錄與相關通道DEBUG日誌級別(propel.DEBUG)。

登錄/查詢記錄是這樣的:

[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 2014-11-14 05:08:16

+2

注意,除非useDebug爲真,否則此命令將不輸出任何內容:$ con = Propel :: getConnection(); $ CON組> useDebug(真); $ CON組> getLastExecutedQuery(); – bbird 2014-11-21 17:24:10