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 被配置(或支持)使用本地数据库准备语句,那么您可能仍然会在数据库中看到占位符。

于 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() 从推进版本 1.4 开始是公开的。这目前在开发中。

于 2009-09-23T14:42:17.663 回答
0

我决定解决问题。实际上我需要INSERT INTO ... SELECT。即 -通过 Criteria创建SELECT语句,进一步附加INSERT INTO并执行。
所以我要求 BasePeer 创建原始 sql ( BasePeer::createSelectSql ),然后在前面附加INSERT INTO。由于我需要填充语句的值(:p1、 :p2等),但方法BasePeer::populateStmtValues是私有的(为什么?)我不得不将该方法复制'粘贴到另一个地方并调用它。

于 2009-09-19T15:32:33.317 回答
0

更简单的尝试:

print($criteria->toString()) ;
于 2012-03-13T22:01:37.533 回答