web-dev-qa-db-fra.com

Obtenir un résultat sur une seule ligne avec Doctrine NativeQuery

J'essaie d'obtenir une seule ligne renvoyée d'une requête native avec Doctrine. Voici mon code:

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

Cette dernière ligne renvoie une liste de joueurs mais je veux juste un résultat. Comment je fais ça?

36
Jason Swett

Vous pouvez utiliser $query->getSingleResult(), qui lève une exception si plusieurs résultats sont trouvés ou si aucun résultat n'est trouvé. (voir la phpdoc liée ici https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791 )

Il y a aussi la fonction moins célèbre $query->getOneOrNullResult() qui lève une exception si plus d'un résultat est trouvé et renvoie la valeur null si aucun résultat n'est trouvé. (voir la phpdoc liée ici https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752 )

84
AdrienBrault

getSingleResult() et getOneOrNullResult() liront une exception s'il existe plusieurs résultats . Pour résoudre ce problème, vous pouvez ajouter setMaxResults(1) à votre générateur de requêtes.

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

-> getSingleScalarResult () retournera une valeur unique au lieu d'un tableau.

9
James Hilton

Je veux juste un résultat

implique que vous vous attendez à ce qu'une seule ligne soit renvoyée. Donc, soit adapter votre requête, par exemple,.

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

(puis utilisez getSingleResult() comme recommandé par AdrienBrault) ou récupérez les lignes sous forme de tableau et accédez au premier élément:

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