2014-10-07 58 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個結果。