2012-07-05 25 views
28

Estoy tratando de obtener una sola fila devuelta desde una consulta nativa con Doctrine. Aquí está mi código:Obtener resultado de una sola fila 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(); 

Esa última línea devuelve una lista de jugadores, pero solo quiero un resultado. ¿Cómo puedo hacer eso?

Respuesta

77

Puede usar $query->getSingleResult(), que emitirá una excepción si se encuentran más de un resultado, o si no se encuentra ningún resultado. (vea el phpdoc relacionado aquí https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791)

También existe el menos famoso $query->getOneOrNullResult() que lanzará una excepción si se encuentran más de un resultado, y devolverá nulo si no se encuentra ningún resultado. (Ver el phpdoc relacionada aquí https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752)

+5

¡Bonito, ni siquiera sabía sobre el getOneOrNullResult, pero eso es bastante útil! –

2

sólo quiero un resultado

implica que usted espera que se devuelva sólo una fila. Por lo tanto, adapte su consulta, p.

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

(y luego usar getSingleResult() según lo recomendado por AdrienBrault) o recuperar filas como una matriz y acceder al primer elemento:

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

Tanto getSingleResult() y getOneOrNullResult() lanzará una excepción si hay más de una resultado. Para solucionar este problema, puede agregar setMaxResults(1) al generador de consultas.

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

Para cualquiera que intente usar 'SetMaxResults (1)' con NativeQuery, ese método no es compatible [documentos para la versión 2.3] (http://www.doctrine-project.org/api/orm/2.3/class-Doctrine. ORM.NativeQuery.html). –

+0

Una preocupación que tengo para esta solución: si ambos afirman que debería haber 0 o 1 resultados, pero luego se tragan la excepción (a través de 'setMaxResults (1)') que debería dar como resultado que esa afirmación sea falsa, entonces es posible que estar enmascarando un problema más insidioso con su modelo de datos o aplicación. Solo para tu información. – MSC

9

-> getSingleScalarResult() devolverá un valor único, en lugar de una matriz.

+1

Esto es lo que estaba buscando para mi consulta SELECT MIN (fecha) ... Devuelve la fecha sin matriz. Gracias. – Strabek

0

en busca de una hilera

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

Para traer todos los registros

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

Aquí puede utilizar la consulta SQL nativo, todo funcionará sin ningún problema.

Cuestiones relacionadas