2012-07-05 12 views
28

Sto cercando di ottenere una riga singola restituita da una query nativa con Doctrine. Ecco il mio codice:Ottieni risultato riga singola con Doctrine NativeQuery

$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(); 

Quella ultima riga restituisce un elenco di giocatori, ma voglio solo un risultato. Come lo faccio?

risposta

77

È possibile utilizzare $query->getSingleResult(), che genera un'eccezione se vengono trovati più risultati o se non viene trovato alcun risultato. (vedere phpdoc correlato qui https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791)

C'è anche il meno famoso $query->getOneOrNullResult() che genera un'eccezione se vengono trovati più risultati e restituisce null se non viene trovato alcun risultato. (Vedi relativo phpdoc qui https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752)

+5

Nice, non sapeva nemmeno di getOneOrNullResult, ma è abbastanza utile! –

2

Voglio solo uno dei risultati

implica che ci si aspetta solo una riga da restituire. Quindi, adatta la tua query, ad es.

SELECT player_id 
FROM players p 
WHERE CONCAT(p.first_name, ' ', p.last_name) = ? 
LIMIT 0, 1 

(e quindi utilizzare getSingleResult() come raccomandato dal AdrienBrault) o fetch righe come un array e accedere al primo elemento:

// ... 
$players = $query->getArrayResult(); 
$myPlayer = $players[0]; 
37

Sia getSingleResult() e getOneOrNullResult() un'eccezione se v'è più di una risultato. Per risolvere questo problema è possibile aggiungere setMaxResults(1) al proprio generatore di query.

$firstSubscriber = $entity->createQueryBuilder()->select('sub') 
     ->from("\Application\Entity\Subscriber", 'sub') 
     ->where('sub.subscribe=:isSubscribe') 
     ->setParameter('isSubscribe', 1) 
     ->setMaxResults(1) 
     ->getQuery() 
     ->getOneOrNullResult(); 
+0

Per chiunque cerchi di utilizzare 'SetMaxResults (1)' con un NativeQuery, quel metodo non è supportato [docs per la versione 2.3] (http://www.doctrine-project.org/api/orm/2.3/class-Doctrine. ORM.NativeQuery.html). –

+0

Una preoccupazione che nutro per questa soluzione - se entrambe affermate che dovrebbero esserci 0 o 1 risultati, ma poi ingoiare l'eccezione (tramite 'setMaxResults (1)') che dovrebbe portare a false asserzioni, allora potreste mascherare un problema più insidioso con il modello di dati o l'applicazione. Solo FYI. – MSC

9

-> getSingleScalarResult() restituirà un valore singolo anziché una matrice.

+1

Questo è quello che stavo cercando per la mia query SELECT MIN (data) .... Data di ritorno senza matrice. Grazie. – Strabek

0

per andare a prendere singola riga

$result = $this->getEntityManager()->getConnection()->fetchAssoc($sql) 

Per recuperare tutti i record

$result = $this->getEntityManager()->getConnection()->fetchAll($sql) 

Qui è possibile utilizzare SQL Query nativa, il tutto funzionerà senza alcun problema.

Problemi correlati