58

我正在尝试使用 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();

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

4

6 回答 6

106

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

于 2012-07-05T23:42:59.030 回答
85

如果有多个结果,两者都会抛出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();
于 2015-08-23T17:32:20.003 回答
18

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

于 2016-06-04T06:18:40.270 回答
5

我只想要一个结果

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

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

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

// ...
$players = $query->getArrayResult();
$myPlayer = $players[0];
于 2013-08-05T07:16:31.890 回答
3

我在这里使用 fetchObject() 一个使用 Symfony 4.4 的小例子

    <?php 
    use Doctrine\DBAL\Driver\Connection;

    class MyController{

    public function index($username){
      $queryBuilder = $connection->createQueryBuilder();
      $queryBuilder
        ->select('id', 'name')
        ->from('app_user')
        ->where('name = ?')
        ->setParameter(0, $username)
        ->setMaxResults(1);
      $stmUser = $queryBuilder->execute();

      dump($stmUser->fetchObject());

      //get_class_methods($stmUser) -> to see all methods
    }
  }

回复:

{ 
"id": "2", "name":"myuser"
}
于 2020-02-25T11:52:21.190 回答
-1

获取单行

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

获取所有记录

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

在这里您可以使用 sql native 查询,一切都可以正常工作。

于 2017-01-11T14:30:47.313 回答