Подтвердить что ты не робот

Использование Raw SQL с доктриной

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

Мой вопрос:

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Я не уверен, что вы имеете в виду, говорящий 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);
     }
}

Ответ 4

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

Ответ 5

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

Пример:

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

Ответ 6

Symfony вставляет raw sql с помощью доктрины.

Это в версии Symfoney 1.3

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