Doctrine 2, Native Query - PullRequest
       21

Doctrine 2, Native Query

8 голосов
/ 25 февраля 2011

Я пытаюсь сделать собственный запрос с Doctrine 2 .. но я не могу заставить его работать ..

$q = "SELECT * FROM user_recent_activity WHERE id = {$user->id}";
$rsm = new \Doctrine\ORM\Query\ResultSetMapping;
$query = $this->_em->createNativeQuery($q, $rsm);
$result = $query->getResult();

Это возвращает пустой массив .. Я не уверен, как этоработает "ResultSetMapping", но я не могу ничего сопоставить с этим запросом, как я видел в примерах на веб-сайте доктрины, потому что user_recent_activity - это не таблица, а такой вид:

id  user_id  type     created_at
12  5        opinion  2011-02-22 23:29:00
2   2       vote     2011-01-30 14:16:51

id представляет разныеобъекты, таким образом, не являются внешним ключом ..

Итак, возможно ли просто сделать обычный запрос к Doctrine 2 ??.. Я схожу с ума ..

Спасибо

Ответы [ 3 ]

7 голосов
/ 25 февраля 2011

Это не должно быть проблемой, если это представление или таблица, когда вы получаете строки и столбцы из вашего запроса.

Вам необходимо отобразить результаты в сущности для нативных SQL-запросов, используя rsm.

$rsm->addEntityResult('UserRecentActivity', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'user_id', 'user_id');
$rsm->addFieldResult('u', 'type', 'type');
$rsm->addFieldResult('u', 'created_at', 'created_at');

И у вас тоже должна быть соответствующая сущность.

Вы можете проверить http://www.doctrine -project.org / docs / orm / 2.0 / en / reference / native-sql.html для более подробных примеров.

UPDATE:

В случае представлений, которые содержат результаты из более чем 1 таблицы, метод addJoinedEntityResult () может использоваться для сопоставления результатов с соответствующими объектами. Вам необходимо соответствующим образом определить сущности и сопоставить результаты с их полями.

Этот метод, вероятно, в конечном итоге будет содержать частичные объекты, поэтому его следует использовать осторожно, чтобы избежать повреждения данных.

Информация о частичных объектах: http://www.doctrine -project.org / docs / orm / 2.0 / en / reference /partal-objects.html

1 голос
/ 11 января 2017

Для получения одного ряда

$result = $this->_em->getConnection()->fetchAssoc($sql)

Чтобы получить несколько строк

$result = $this->_em->getConnection()->fetchAll($sql)

Здесь используется собственный запрос sql вместо $ sql выше.

1 голос
/ 06 июня 2011

Другая возможность для вашей проблемы - использовать собственные запросы в сочетании со скалярными результатами. Для получения дополнительной информации, смотрите эту ссылку, пункт 12.2.4. Надеюсь быть полезным.

...