6

Propel Criteria をコンパイルして SQL をクリアするにはどうすればよいですか? $criteria->toString(); を試しました。しかし、これは私が期待したものではありません。また、ModelPeer::doSelectStmt($criteria) を試しましたが、生の SQL が返されました (パラメーターの置換が必要です)。

4

5 に答える 5

12

まず第一に、Propel は準備済みステートメントで PDO を使用することに注意することが重要です。そのため、PHP で完全に「組み込まれた」SQL ステートメントを取得することはできません。Criteria->toString() を使用することは良い出発点ですが、Peter が言及しているように、多くの作業は実際には BasePeer::createSelectSql() メソッドによって行われます。

以下は、SQL がどのように見えるか (プレースホルダー付き) と置換されるパラメーターを確認する最も完全な方法 (Propel から) です。

$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";

データベースレベルでクエリをログに記録するだけで、マイレージが向上する可能性があることに注意してください。もちろん、PDO がネイティブ db プリペアド ステートメントを使用するように構成 (またはサポート) されている場合、db にもプレースホルダーが表示されることがあります。

于 2009-09-18T11:03:09.310 に答える
2

これが方法だと思います

$rawSql = BasePeer::createSelectSql( $criteria, $params );
于 2009-09-09T14:13:12.367 に答える
1

最近、同じ問題が発生しました。http://groups.google.com/group/propel-development/browse_thread/thread/f56a5a8ee5db3b60を参照してください。

現在 BasePeer::populateStmtValues() は propel バージョン 1.4 以降で公開されています。これは現在開発中です。

于 2009-09-23T14:42:17.663 に答える
0

さらに簡単に試してください:

print($criteria->toString()) ;
于 2012-03-13T22:01:37.533 に答える
0

私は回避することにしました。実際にはINSERT INTO ... SELECTが必要でした。つまり、基準を使用してSELECTステートメントを作成し、さらにINSERT INTOを追加して実行します。
そこで、BasePeer に生の SQL を作成するように依頼し ( BasePeer::createSelectSql )、先にINSERT INTOを追加しました。ステートメントの値を設定する必要があるため ( :p1、:p2など)、メソッドBasePeer::populateStmtValuesはプライベートです (なぜですか?) そのメソッドを別の場所にコピーして貼り付けて呼び出す必要がありました。

于 2009-09-19T15:32:33.317 に答える