首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当未找到结果时,HYDRATE_SINGLE_SCALAR将导致getOneOrNullResult中的异常

当未找到结果时,HYDRATE_SINGLE_SCALAR将导致getOneOrNullResult中的异常
EN

Stack Overflow用户
提问于 2014-10-07 14:34:28
回答 1查看 2.9K关注 0票数 3

当我尝试使用以Doctrine\ORM\Query#getOneOrNullResult为水合模式的HYDRATE_SINGLE_SCALAR方法时,如果没有找到结果,就会抛出Doctrine\ORM\NoResultException:

代码语言:javascript
复制
$q=$em->createQueryBuilder()
    ->select('ticket.tickets_id')
    ->from('e:Ticket','ticket')
    ->where('ticket.ticketnumber=:ticketnumber')
    ->setParameter('ticketnumber','kr1r9x')
    ->getQuery()
;
// these both work:
var_dump($q->getOneOrNullResult(Query::HYDRATE_SCALAR));
var_dump($q->getOneOrNullResult(Query::HYDRATE_SINGLE_SCALAR));

$q=$em->createQueryBuilder()
    ->select('ticket.tickets_id')
    ->from('e:Ticket','ticket')
    ->where('ticket.ticketnumber=:ticketnumber')
    ->setParameter('ticketnumber','foobar')
    ->getQuery()
;
// this works
var_dump($q->getOneOrNullResult(Query::HYDRATE_SCALAR));
// this fails
var_dump($q->getOneOrNullResult(Query::HYDRATE_SINGLE_SCALAR));

我希望在最后一次调用中返回NULL,但实际输出是:

代码语言:javascript
复制
% php ~/test.php
array(1) {
  'tickets_id' =>
  string(6) "119827"
}
string(6) "119827"
NULL
Fatal error: Uncaught exception 'Doctrine\ORM\NoResultException' with message 'No result was found for query although at least one row was expected.' in ~/project/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php on line 43

Doctrine\ORM\NoResultException: No result was found for query although at least one row was expected. in ~/project/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php on line 43

Call Stack:
    0.0002     640440   1. {main}() ~/test.php:0
    0.1575   15011776   2. Doctrine\ORM\AbstractQuery->getOneOrNullResult() ~/test.php:28
    0.1575   15011824   3. Doctrine\ORM\AbstractQuery->execute() ~/project/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php:612
    0.1581   15016432   4. Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll() ~/project/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php:804
    0.1581   15016432   5. Doctrine\ORM\Internal\Hydration\SingleScalarHydrator->hydrateAllData() ~/project/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:140

难道不可能以这种方式获得单个标量或NULL吗?

(我知道解决办法是使用HYDRATE_SCALAR,我只是想知道为什么HYDRATE_SINGLE_SCALAR不能工作)

原则ORM v2.4.5,DBAL &CommonV2.4.2

EN

回答 1

Stack Overflow用户

发布于 2015-10-07 17:39:47

NULL不是标量值,所以在找不到行时,原则抛出异常是正确的。

正确的处理方法是捕获和处理异常。您可以选择将结果设置为NULL,执行另一个操作,或通过抛出自己的异常来抽象异常。例如,如果您试图为结果设置一个变量:

代码语言:javascript
复制
// After defining QueryBuilder $q
try {
    $result = $q->getOneOrNullResult(Query::HYDRATE_SINGLE_SCALAR);
} catch (\Doctrine\ORM\NoResultException $e) {
    // Handle the exception here. In this case, we are setting the variable to NULL
    $result = null;
}

至于HYDRATE_SCALAR和HYDRATE_SINGLE_SCALAR: HYDRATE_SINGLE_SCALAR之间的区别,它只返回一个值,因此如果它没有要返回的值,则必须抛出一个错误。HYDRATE_SCALAR返回任意数量的值的数组,包括0,所以它可以返回0结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26238542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档