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"
}