web-dev-qa-db-ja.com

Propel:クエリオブジェクトから生のSQLを取得しますか?

Propelのクエリオブジェクトから生のSQLステートメントを取得するにはどうすればよいですか?デバッグのためにこれが必要です。

例:次のような機能が欲しい

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

このようなものは存在しますか?

18
twigmac

はい; Criteria 親クラスのtoStringメソッドを探しています:

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

@jakerellaが言うように、フィルタリングに使用する特定の値は、Propelではなくデータベースエンジンによってバインドされるため、クエリの構造は表示されますが、実行される内容は正確には表示されません。それを確認したい場合は、データベースのクエリログが有効になっているかどうかを確認できます。

19
halfer

受け入れられた回答を満たすと、次のコードを後でクエリ実行に使用できます。

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

に送信された完全なクエリ選択された列とフェッチされたパラメータを含む)を確認できますデータベース。


[〜#〜] upd [〜#〜]:( @bbird

このコマンドは、useDebugtrueでない限り、何も出力しません。

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

UPD2:(Symfonyフレームワークを使用している場合

言及する価値のあるもう1つのことは、PropelORM+Symfonyです。

SQLをトレースする必要がある場合は、ログを使用できます。 Propelには独自の 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 [] []
10
Paul T. Rawkeen