Propel Criteria をコンパイルして SQL をクリアするにはどうすればよいですか? $criteria->toString(); を試しました。しかし、これは私が期待したものではありません。また、ModelPeer::doSelectStmt($criteria) を試しましたが、生の SQL が返されました (パラメーターの置換が必要です)。
5 に答える
まず第一に、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 にもプレースホルダーが表示されることがあります。
これが方法だと思います
$rawSql = BasePeer::createSelectSql( $criteria, $params );
最近、同じ問題が発生しました。http://groups.google.com/group/propel-development/browse_thread/thread/f56a5a8ee5db3b60を参照してください。
現在 BasePeer::populateStmtValues() は propel バージョン 1.4 以降で公開されています。これは現在開発中です。
さらに簡単に試してください:
print($criteria->toString()) ;
私は回避することにしました。実際にはINSERT INTO ... SELECTが必要でした。つまり、基準を使用してSELECTステートメントを作成し、さらにINSERT INTOを追加して実行します。
そこで、BasePeer に生の SQL を作成するように依頼し ( BasePeer::createSelectSql )、先にINSERT INTOを追加しました。ステートメントの値を設定する必要があるため ( :p1、:p2など)、メソッドBasePeer::populateStmtValuesはプライベートです (なぜですか?) そのメソッドを別の場所にコピーして貼り付けて呼び出す必要がありました。