Использование Raw SQL с Doctrine
У меня есть несколько чрезвычайно сложных запросов, которые мне нужно использовать для создания отчета в моем приложении. Я использую Symfony в качестве основы и доктрины в качестве ORM.
У меня вопрос такой:
Каков наилучший способ передачи сложных SQL-запросов напрямую в Doctrine без преобразования их в язык запросов Doctrine? Я читал о Raw_SQL
расширение, но кажется, что вам все равно нужно передать запрос в разделах (например, from()
). Есть ли что-то для простого сброса в кучу сырых команд SQL?
6 ответов
$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);
}
}
Вы также можете использовать Doctrine_RawSql(); создавать необработанные SQL-запросы, которые будут привязаны к объектам доктрины.
Следует отметить, что Doctrine2 использует PDO в качестве основы, поэтому я бы рекомендовал использовать подготовленные операторы поверх простого старого выполнения.
Пример:
$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);