Подтвердить что ты не робот

Использование собственного 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.

4b9b3361

Ответ 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