Использование собственного SQL-запроса без класса сущности
Мне нужно создать собственный 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
с "анонимным" объектом? Или, по крайней мере, возможно создать объект, который не будет создавать таблицу в следующий раз, когда я обновляю схему, чтобы я мог сопоставить результаты с ней?
Или есть ли какой-либо другой способ, подходящий для Doctrine, справиться с таким запросом? Однако внесение изменений в базу данных невозможно, поскольку я имею дело с устаревшими материалами, которые нельзя коснуться. Я также сильно предпочел бы, если бы я сделал все на стороне базы данных, не привлекая к ней большую часть PHP.
Ответы
Ответ 1
Есть ли необходимость привязать результаты к объекту домена? Если нет, вы можете использовать DBAL для создания простого старого запроса, который вернет массив, как описано в поваренной книге Symfony2 и документация DBAL Doctrine:
$conn = $this->container->get('database_connection');
$sql = 'SELECT res.id, COUNT(*)...';
$rows = $conn->query($sql);
Ответ 2
Использовать метод 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