Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm 使用Doctrine NativeQuery获取单行结果_Doctrine Orm - Fatal编程技术网

Doctrine orm 使用Doctrine NativeQuery获取单行结果

Doctrine orm 使用Doctrine NativeQuery获取单行结果,doctrine-orm,Doctrine Orm,我正试图从一个带有条令的本机查询返回一行。这是我的密码: $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, ' '

我正试图从一个带有条令的本机查询返回一行。这是我的密码:

$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)

还有不太出名的
$query->getOneOrNullResult()
,如果找到多个结果,它将抛出异常,如果找不到结果,则返回null。(参见此处的相关phpdoc)

我只想要一个结果

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

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];
如果存在多个结果,则
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();
->getSingleScalarResult()将返回单个值,而不是数组。

获取单个行

$result = $this->getEntityManager()->getConnection()->fetchAssoc($sql)
获取所有记录

$result = $this->getEntityManager()->getConnection()->fetchAll($sql)
这里您可以使用sql本机查询,所有查询都可以正常工作。

我使用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
    }
  }

很好,我甚至不知道getOneOrNullResult,但这非常有用!如果您想在数组中生成结果:
->getOneOrNullResult(Query::hydrome\u数组)
这就是我在寻找我的SELECT MIN(日期)的原因。。。查询返回不带数组的日期。谢谢。对于试图将
SetMaxResults(1)
与NativeQuery一起使用的任何人,该方法不受支持。我对该解决方案有一个担忧-如果你们都断言应该有0或1个结果,但随后吞下异常(通过
SetMaxResults(1)
),这将导致该断言为假,然后,您可能会掩盖数据模型或应用程序中更隐蔽的问题。仅供参考。如果您希望生成一个数组:
->getOneOrNullResult(查询::水合物\u数组)
{ 
"id": "2", "name":"myuser"
}