使用没有实体类的本机SQL查询

Ond*_*ták 25 php symfony doctrine-orm

我需要使用几个联合和子查询创建本机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
Run Code Online (Sandbox Code Playgroud)

结果将不匹配我在我的应用程序中使用的任何实体.是否可以ResultSetMapping使用"匿名"对象创建?或者至少可以创建一个实体,下次我更新架构时不会创建表,所以我可以将结果映射到它?

或者是否有任何其他Doctrine友好的方式来处理这样的查询?但是,对数据库进行更改是不可能的,因为我正在处理无法触及的遗留内容.如果我在数据库方面做了所有事情,并且不涉及大量PHP,我也非常喜欢.

Pro*_*tic 40

您是否特别需要将结果映射到域对象?如果没有,您可以使用DBAL创建一个普通的旧查询,它将返回一个数组,详见Symfony2 cookbookDoctrine DBAL文档:

$conn = $this->container->get('database_connection');
$sql = 'SELECT res.id, COUNT(*)...';
$rows = $conn->query($sql);
Run Code Online (Sandbox Code Playgroud)

  • http://www.metod.si/get-doctrine2-dbal-connection-for-different-databases-in-symfony2/ =>如果你想连接超过1分贝 (2认同)

小智 10

使用ResultSetMapping的addScalarResult方法

$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);
Run Code Online (Sandbox Code Playgroud)

结果数组:

array (size=1)
  0 => 
    array (size=2)
      'cnt' => int 1
      'id' => int 15
Run Code Online (Sandbox Code Playgroud)