2014-10-07 56 views
3

当我尝试使用学说\ ORM \查询#getOneOrNullResult法HYDRATE_SINGLE_SCALAR水化模式,一种学说\ ORM \ NoResultException被抛出时,没有结果发现:HYDRATE_SINGLE_SCALAR导致例外getOneOrNullResult时没有找到结果

$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 &常见V2.4.2

+0

同样的问题在这里。奇怪的。现在我正在使用getOneOrNullResult + HYDRATE_SCALAR,检查是否为空($ result) – gremo 2015-02-04 09:11:00

回答

0

是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个结果。