Использование собственного запроса SQL без класса сущности - PullRequest
25 голосов
/ 28 июля 2011

Мне нужно создать собственный SQL-запрос с несколькими объединениями и подзапросами. Это будет выглядеть примерно так:

SELECT res.id, COUNT(*) as count_ids
FROM (
    SELECT a.id FROM ... a WHERE ... LIKE ('%:param%')
    UNION ALL
    SELECT b.id FROM ... b WHERE ... LIKE ('%:param%')
    UNION ALL
    ...
) res
GROUP BY res.id
ORDER BY count_ids asc

Результат не будет соответствовать ни одной сущности, которую я использую в своем приложении. Можно ли создать ResultSetMapping с «анонимным» объектом? Или, по крайней мере, возможно создать сущность, которая не будет создавать таблицу при следующем обновлении схемы, чтобы я мог сопоставить с ней результаты?

Или есть какой-нибудь другой дружественный Доктрине способ справиться с таким запросом? Вносить изменения в базу данных невозможно, так как я имею дело с устаревшими вещами, которые нельзя затронуть. Я также настоятельно предпочел бы, чтобы я делал все на стороне базы данных, не задействуя большую часть PHP.

Ответы [ 2 ]

40 голосов
/ 29 июля 2011

Есть ли у вас особая необходимость сопоставлять результаты с объектом домена? Если нет, то вы можете использовать DBAL для создания простого старого запроса, который будет возвращать массив, как описано в поваренной книге Symfony2 и в документации Doctrine DBAL :

$conn = $this->container->get('database_connection');
$sql = 'SELECT res.id, COUNT(*)...';
$rows = $conn->query($sql);
9 голосов
/ 14 октября 2017

Использование addScalarResult метод ResultSetMapping

$rsm = new ResultSetMapping();

$rsm->addScalarResult('cnt', 'cnt');
$rsm->addScalarResult('id', 'id');

$query = $this->em->createNativeQuery('SELECT count(*) AS  cnt, id_column as id FROM your_table group by id', $rsm);

$result = $query->getResult();

var_dump($result);

Массив результатов:

array (size=1)
  0 => 
    array (size=2)
      'cnt' => int 1
      'id' => int 15
...