使用Doctrine NativeQuery获取单行结果

Jas*_*ett 42 doctrine-orm

我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*ult 90

您可以使用$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)

  • 很好,甚至不知道getOneOrNullResult,但这非常有帮助! (6认同)

Mos*_*aei 61

无论getSingleResult()getOneOrNullResult()如果有不止一个结果会抛出异常.要解决此问题,您可以添加setMaxResults(1)到查询构建器.

 $firstSubscriber = $entity->createQueryBuilder()->select('sub')
        ->from("\Application\Entity\Subscriber", 'sub')
        ->where('sub.subscribe=:isSubscribe')
        ->setParameter('isSubscribe', 1)  
        ->setMaxResults(1)
        ->getQuery()
        ->getOneOrNullResult();
Run Code Online (Sandbox Code Playgroud)

  • 我对此解决方案有一个担心-如果您都断言应该有0或1个结果,但是吞下应该导致断言为false的异常(通过`setMaxResults(1)`),那么您可能是掩盖您的数据模型或应用程序中更隐蔽的问题。仅供参考。 (2认同)

小智 10

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


Got*_*bel 5

我只想要一个结果

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

SELECT player_id
FROM players p
WHERE CONCAT(p.first_name, ' ', p.last_name) = ?
LIMIT 0, 1
Run Code Online (Sandbox Code Playgroud)

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

// ...
$players = $query->getArrayResult();
$myPlayer = $players[0];
Run Code Online (Sandbox Code Playgroud)