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

Я хочу выполнить необработанный SQL с помощью Doctrine 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(); } 
 //$sql - sql statement //$em - entity manager $em->getConnection()->exec( $sql ); 

Я получил это, чтобы работать, делая это, предполагая, что вы используете 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 в соответствии с вашими потребностями.

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

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

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

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

Подцепите своего менеджера и создайте новое соединение:

 $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']); 

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

 $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.

Вы не можете, 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-бизнесе.

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