使用不带实体类的本机 SQL 查询

2022-08-30 15:33:18

我需要使用几个并集和子查询创建本机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。


答案 1

您是否特别需要将结果映射到域对象?如果没有,您可以使用 DBAL 进行普通的旧查询,该查询将返回一个数组,如 Symfony2 说明书Doctrine DBAL 文档中所述:

$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

推荐