当我尝试使用以Doctrine\ORM\Query#getOneOrNullResult为水合模式的HYDRATE_SINGLE_SCALAR方法时,如果没有找到结果,就会抛出Doctrine\ORM\NoResultException:
$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,但实际输出是:
% 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
发布于 2015-10-07 17:39:47
NULL不是标量值,所以在找不到行时,原则抛出异常是正确的。
正确的处理方法是捕获和处理异常。您可以选择将结果设置为NULL,执行另一个操作,或通过抛出自己的异常来抽象异常。例如,如果您试图为结果设置一个变量:
// 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结果。
https://stackoverflow.com/questions/26238542
复制相似问题