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?
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 )
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();
-> getSingleScalarResult () retournera une valeur unique au lieu d'un tableau.
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];