Выполнить сырой SQL с помощью Doctrine 2 - PullRequest
93 голосов
/ 24 июля 2010

Я хочу выполнить сырой SQL, используя Doctrine 2

Мне нужно обрезать таблицы базы данных и инициализировать таблицы с тестовыми данными по умолчанию.

Ответы [ 8 ]

157 голосов
/ 30 марта 2012

Вот пример необработанного запроса в Doctrine 2, который я делаю:

public function getAuthoritativeSportsRecords()
{   
    $sql = " 
        SELECT name,
               event_type,
               sport_type,
               level
          FROM vnn_sport
    ";

    $em = $this->getDoctrine()->getManager();
    $stmt = $em->getConnection()->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll();
}   
50 голосов
/ 10 февраля 2012
//$sql - sql statement
//$em - entity manager

$em->getConnection()->exec( $sql );
39 голосов
/ 26 ноября 2014

Я заставил его работать, предполагая, что вы используете PDO.

//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";

//set parameters 
//you may set as many parameters as you have on your query
$params['color'] = blue;


//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);

Вы можете изменить FETCH_TYPE в соответствии со своими потребностями.

12 голосов
/ 14 февраля 2014

Как выполнить необработанный запрос и вернуть данные.

Подключитесь к своему менеджеру и установите новое соединение:

$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();

Создайте запрос и получите все:

$result= $conn->query('select foobar from mytable')->fetchAll();

Получить данные из результата, как это:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
12 голосов
/ 25 июля 2010

Я узнал, что ответ, вероятно:

NativeQuery позволяет вам запускать нативный SQL, отображение результатов в соответствии с ваши спецификации. Такой спецификация, которая описывает, как Набор результатов SQL сопоставляется с доктриной результат представлен ResultSetMapping.

Источник: Собственный SQL .

5 голосов
/ 11 августа 2014

В вашей модели создайте необработанный оператор SQL (пример ниже - это пример интервала дат, который мне пришлось использовать, но замените свой собственный. Если вы делаете SELECT add -> fetchall () к вызову execute ().

   $sql = "DELETE FROM tmp 
            WHERE lastedit + INTERVAL '5 minute' < NOW() ";

    $stmt = $this->getServiceLocator()
                 ->get('Doctrine\ORM\EntityManager')
                 ->getConnection()
                 ->prepare($sql);

    $stmt->execute();
5 голосов
/ 06 марта 2012

У меня была такая же проблема. Вы хотите посмотреть объект соединения, предоставленный менеджером объекта:

$conn = $em->getConnection();

Затем вы можете запросить / выполнить прямо к нему:

$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');

См. Документы по объекту подключения по адресу http://www.doctrine -project.org / api / dbal / 2.0 / doctrine / dbal / connection.html

4 голосов
/ 27 сентября 2016

Вы не можете, Doctrine 2 не допускает необработанные запросы.Может показаться, что вы можете, но если вы попробуете что-то вроде этого:

$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);

Doctrine выдаст ошибку, сообщив, что DATE_FORMAT - неизвестная функция.

Но моя база данных (mysql) знаетЭта функция, так что в основном происходит то, что Doctrine анализирует этот запрос за кулисами (и за вашей спиной) и находит выражение, которое оно не понимает, считая запрос недействительным.

Так что еслиЕсли вы хотите, чтобы вы могли просто отправить строку в базу данных и позволить ей справиться с ней (и позволить разработчику взять на себя полную ответственность за безопасность), забудьте об этом.

Конечно, вы можете написать расширение, которое позволитэто так или иначе, но вы также можете использовать mysqli для этого и оставить Doctrine в своем бизнесе ORM.

...