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


person Ondrej Slinták    schedule 28.07.2011    source источник


Ответы (2)


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

$conn = $this->container->get('database_connection');
$sql = 'SELECT res.id, COUNT(*)...';
$rows = $conn->query($sql);
person Derek Stobbe    schedule 29.07.2011
comment
metod.si/ = › если вы хотите подключиться к более чем 1 дб - person TOZ; 10.10.2016

Используйте метод 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
person illia permiakov    schedule 14.10.2017
comment
Если вы хотите получить только значение cnt, вы можете изменить getResult() на getSingleScalarResult(). Ваш результат будет 1. - person R Picheta; 22.05.2019
comment
Да, спасибо, это был простой бессмысленный демонстрационный запрос, основанный на моих реальных запросах с аналогичной группировкой и возвратом 2 столбцов. - person illia permiakov; 22.05.2019