与原则一起使用原始的SQL

我有一些非常复杂的查询,我需要用它来在我的应用程序中生成报告。 我使用symfony作为我的框架和学说作为我的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(); 

你可以像上面的例子那样使用绑定variables。

请注意,Doctrine不会自动将您的结果很好地融合到logging对象中,因此您需要处理以数组forms返回的结果,每行返回一个数组(由键值作为列值)。

我不知道你的意思是说什么原始的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); } } 

你也可以使用Doctrine_RawSql(); 创build原始的SQL查询,这些查询将水合到原则对象。

应该指出的是,Doctrine2使用PDO作为基础,因此我build议使用准备好的语句而不是普通的旧执行。

例:

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

Symfony使用原则插入原始的sql。

这在版本Symfoney 1.3

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