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