使用Doctrine NativeQuery获取单行结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Doctrine NativeQuery获取单行结果相关的知识,希望对你有一定的参考价值。

我正在尝试使用Doctrine从本机查询返回单行。这是我的代码:

$rsm = new ResultSetMapping;
$rsm->addEntityResult('VNNCoreBundle:Player', 'p');
$rsm->addFieldResult('p', 'player_id', 'id');

$sql = " 
    SELECT player_id
      FROM players p
     WHERE CONCAT(p.first_name, ' ', p.last_name) = ?
";

$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$query->setParameter(1, $name);
$players = $query->getResult();

最后一行返回一个玩家列表,但我只想要一个结果。我怎么做?

答案

您可以使用$query->getSingleResult(),如果找到多个结果,或者如果没有找到结果,则会抛出异常。 (参见相关的phpdoc https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791

还有不那么着名的$query->getOneOrNullResult(),如果找到多个结果将抛出异常,如果没有找到结果则返回null。 (参见相关的phpdoc https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752

另一答案

如果有多个结果,getSingleResult()getOneOrNullResult()都将抛出异常。要解决此问题,您可以将setMaxResults(1)添加到查询构建器。

 $firstSubscriber = $entity->createQueryBuilder()->select('sub')
        ->from("ApplicationEntitySubscriber", 'sub')
        ->where('sub.subscribe=:isSubscribe')
        ->setParameter('isSubscribe', 1)  
        ->setMaxResults(1)
        ->getQuery()
        ->getOneOrNullResult();
另一答案

- > getSingleScalarResult()将返回单个值,而不是数组。

另一答案

我只想要一个结果

意味着您只希望返回一行。因此要么调整您的查询,例如

SELECT player_id
FROM players p
WHERE CONCAT(p.first_name, ' ', p.last_name) = ?
LIMIT 0, 1

(然后按照AdrienBrault的建议使用getSingleResult())或将行作为数组获取并访问第一项:

// ...
$players = $query->getArrayResult();
$myPlayer = $players[0];
另一答案

要获取单行

$result = $this->getEntityManager()->getConnection()->fetchAssoc($sql)

获取所有记录

$result = $this->getEntityManager()->getConnection()->fetchAll($sql)

在这里你可以使用sql native查询,所有这些都可以正常工作。

以上是关于使用Doctrine NativeQuery获取单行结果的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine2:使用 NativeQuery 和 ResultSetMapping 进行查询

使用 Doctrine ORM ManyToOne 关系在相反方向获取实体

Doctrine DQL:如何使表达式反转

Doctrine2 - (如何)使用 main 获取关联对象

使用 Doctrine 获取多行单列数组

在 Doctrine 中使用继承时查询派生类型的属性