2010-05-05 2 views
40

У меня есть чрезвычайно сложные запросы, которые мне нужно использовать для создания отчета в моем приложении. Я использую symfony как свою структуру и доктрину как свой ORM.Использование Raw SQL с доктриной

Мой вопрос заключается в следующем:

Каков наилучший способ передать в высоко-сложных SQL запросов непосредственно в Доктрине без преобразования их в Doctrine Query Language? Я читал о расширении Raw_SQL, но, похоже, вам все равно нужно передать запрос в разделах (например, from()). Есть ли что-то для того, чтобы просто сбросить кучу сырых команд sql?

+0

Простите меня от темы, но какой инструмент/библиотеки вы используете для создания отчетов приложений? С уважением! –

+2

Прямо сейчас? Просто SQL, raw PHP и gall. : D –

ответ

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

Смотрите API документации Doctrine для различных методов выполнения.

+0

Это работает для обновления поданной тоже ??? – simple

+0

@simple: Да, вы можете использовать любой SQL, который вы хотите. – Tom

+7

Поскольку этот ответ, кажется, популярен, я должен добавить, что этот метод обходит экранирование, предлагаемое Doctrine, поэтому избегайте действий вручную или вы можете оставить себя открытым для SQL-инъекций. – Tom

38

Да. Вы можете получить базу данных ручку из Доктрины, используя следующий код:

$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 автоматически не улавливает ваши результаты в объектах записи и т. Д., Поэтому вам нужно будет обрабатывать результаты, возвращаемые как массив, состоящий из одного массива на каждую строку, возвращаемую (значение ключа, стоимость).

+0

Есть ли способ заставить доктрину гидратировать результаты, которые я получаю через PDO? или мне просто нужно работать с тем, что мне дано? –

+0

Из памяти, когда я использовал выше, а не автоматически, поскольку Doctrine не знает, какие у вас есть столбцы. Если вы достаточно хорошо назвали столбцы, я бы предположил, что вы можете использовать fromArray() или аналогичные, но данные нужно будет переформатировать в нечто пригодное для использования. – richsage

+0

Если вы можете, используйте свой запрос, чтобы вернуть идентификатор записи, а затем используйте обычный старый столбец $ table-> find ($ id) для его загрузки. – lotsoffreetime

6

Я не уверен, что вы имеете в виду говоря необработанный SQL, но coud выполнять традиционные SQL запросов следующим образом:

... 
// $this->_displayPortabilityWarning(); 

$conn = Doctrine_Manager::connection(); 
$pdo = $conn->execute($sql); 
$pdo->setFetchMode(Doctrine_Core::FETCH_ASSOC); 
$result = $pdo->fetchAll(); 
... 

Следующий метод не necsessary, но он показывает хорошую практику.

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); 
    } 
} 
6

Вы также можете использовать Doctrine_RawSql(); для создания необработанных SQL-запросов, которые будут увлажнять объекты доктрины.

6

Следует отметить, что Doctrine2 использует PDO в качестве базы, поэтому я бы рекомендовал использовать подготовленные инструкции поверх простого старого выполнения.

Пример:

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

Этот вопрос касается Symfony 1. В Symfony 1 используется Doctrine 1.2 - этот ответ может быть ошибочным. – xmc

+0

Извините, я не хотел вводить в заблуждение. Решение остается в силе, хотя Symfony 1 можно использовать и с Doctrine. –

+1

+1 для примера использования подготовки запроса. –

0

Symfony вставки сырой SQL, используя доктрину.

это в версии Symfoney 1,3

$q = Doctrine_Manager::getInstance()->getCurrentConnection(); 
$result = $q->execute($query); 
Смежные вопросы