我需要使用一些非常复杂的查询来生成我的应用程序中的报告。 我正在使用Symfony作为我的框架,Doctrine作为我的ORM。
我的问题是:
如何最好地将高度复杂的SQL查询直接传递给Doctrine而不将它们转换为Doctrine查询语言? 我一直在阅读关于 Raw_SQL
扩展的文章,但似乎仍然需要按部就班地传递查询(例如 from()
)。 有没有可以只倾倒一堆原始SQL命令的方法?
我需要使用一些非常复杂的查询来生成我的应用程序中的报告。 我正在使用Symfony作为我的框架,Doctrine作为我的ORM。
我的问题是:
如何最好地将高度复杂的SQL查询直接传递给Doctrine而不将它们转换为Doctrine查询语言? 我一直在阅读关于 Raw_SQL
扩展的文章,但似乎仍然需要按部就班地传递查询(例如 from()
)。 有没有可以只倾倒一堆原始SQL命令的方法?
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");
请查看Doctrine API文档以获取不同的执行方法。
是的。您可以使用以下代码从Doctrine获取数据库句柄:
$pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
然后按如下方式执行您的 SQL:
$query = "SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2";
$stmt = $pdo->prepare($query);
$params = array(
"param1" => "value1",
"param2" => "value2"
);
$stmt->execute($params);
$results = $stmt->fetchAll();
你可以像上面的例子一样使用绑定变量。
请注意,Doctrine不会自动将结果优雅地转化为记录对象等,因此您需要处理返回的结果作为数组,每行返回一个数组(列值作为键值对)。
我不确定你说的原始SQL是什么意思,但可以通过以下方式执行传统的SQL查询:
...
// $this->_displayPortabilityWarning();
$conn = Doctrine_Manager::connection();
$pdo = $conn->execute($sql);
$pdo->setFetchMode(Doctrine_Core::FETCH_ASSOC);
$result = $pdo->fetchAll();
...
protected function _displayPortabilityWarning($engine = 'pgsql')
{
$conn = Doctrine_Manager::connection();
$driver = $conn->getDriverName();
if (strtolower($engine) != strtolower($driver)) {
trigger_error('Here we have possible database portability issue. This code was tested on ' . $engine . ' but you are trying to run it on ' . $driver, E_USER_NOTICE);
}
}
示例:
$db = Doctrine_Manager::getInstance()->getCurrentConnection();
$query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value");
$query->execute(array('value' => 'someValue'));
Symfony使用Doctrine插入原始SQL语句。
这是版本Symfoney 1.3中的操作。
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute($query);