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

Выполнение необработанного SQL с помощью Doctrine 2

Я хочу выполнить необработанный SQL с помощью Doctrine 2

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вот пример необработанного запроса в 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();
}   

Ответ 3

//$sql - sql statement
//$em - entity manager

$em->getConnection()->exec( $sql );

Ответ 4

У меня это получилось, если вы используете PDO.

//Place query here, let 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 в соответствии с вашими потребностями.

Ответ 5

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

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

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

Создайте свой запрос и fetchAll:

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

Получите данные из результата следующим образом:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);

Ответ 6

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

$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

Ответ 7

Вы не можете, 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, чтобы сделать это, и оставите доктрину для нее ORM-бизнес.

Ответ 8

В вашей модели создайте необработанную инструкцию 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();