Использование Raw SQL с доктриной
У меня есть несколько чрезвычайно сложных запросов, которые мне нужно использовать для создания отчета в моем приложении. Я использую Symfony, так как моя база и доктрина как мой ОРМ.
Мой вопрос таков:
Как лучше всего передать в очень сложных sql-запросах непосредственно доктрине без преобразования их в язык запросов доктрины? Я читал о расширении Raw_SQL, но, похоже, вам все еще нужно передать запрос в разделах (например, from()). Есть ли что-нибудь для просто сбрасывание в кучу необработанных sql-команд?
6 ответов:
$q = Doctrine_Manager::getInstance()->getCurrentConnection(); $result = $q->execute(" -- RAW SQL HERE -- ");Смотрите документацию Doctrine API для различных методов выполнения.
Да. Вы можете получить дескриптор базы данных из доктрины, используя следующий код:
$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();Вы можете использовать связанные переменные, как в приведенном выше примере.
Обратите внимание, что доктрина не будет автоматически гидрировать ваши результаты в объекты записи и т. д., Поэтому вам нужно будет иметь дело с результатами, возвращаемыми в виде массива, состоящего из одного массива на возвращаемую строку (ключ-значение как значение столбца).
Я не уверен, что вы имеете в виду, говоря raw 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(); для создания необработанных SQL-запросов, которые будут гидрироваться в объекты doctrine.
Следует отметить, что Doctrine2 использует PDO в качестве базы, поэтому я бы рекомендовал использовать подготовленные операторы поверх обычного старого execute.
Пример:
$db = Doctrine_Manager::getInstance()->getCurrentConnection(); $query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value"); $query->execute(array('value' => 'someValue'));
Symfony вставить raw sql с помощью доктрины.
Это в версии Symfoney 1.3
$q = Doctrine_Manager::getInstance()->getCurrentConnection(); $result = $q->execute($query);
Comments