将Raw SQL与Doctrine一起使用

时间:2010-05-05 16:13:57

标签: sql symfony1 doctrine

我需要使用一些非常复杂的查询来在我的应用程序中生成报告。我使用symfony作为我的框架和学说作为我的ORM。

我的问题是:

将高度复杂的SQL查询直接传递给Doctrine而不将其转换为Doctrine查询语言的最佳方法是什么?我一直在阅读有关Raw_SQL扩展程序的信息,但您似乎仍需要在部分(例如from())中传递查询。是否有任何东西只是在一堆原始的sql命令中转储?

6 个答案:

答案 0 :(得分:50)

$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");

有关不同的执行方法,请参阅Doctrine API文档。

答案 1 :(得分:39)

是。您可以使用以下代码从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不会自动将结果很好地保存到记录对象等中,因此您需要处理作为数组返回的结果,每行返回一个数组(键值作为列值) )。

答案 2 :(得分:6)

我不确定你说原始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);
     }
}

答案 3 :(得分:6)

你也可以使用Doctrine_RawSql();创建原始SQL查询,以便与教条对象保持一致。

答案 4 :(得分:6)

应该注意的是,Doctrine2使用PDO作为基础,因此我建议使用预处理语句而不是普通的旧执行。

示例:

$db = Doctrine_Manager::getInstance()->getCurrentConnection();
$query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value");
$query->execute(array('value' => 'someValue'));

答案 5 :(得分:0)

Symfony使用doctrine插入原始sql。

这在版本Symfoney 1.3

$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute($query);