Obtenez en une seule rangée résultat avec la Doctrine NativeQuery
Je vais essayer d'obtenir une seule ligne retourné par une requête native avec la 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();
Que la dernière ligne renvoie une liste de joueurs, mais je veux juste un résultat. Comment dois-je faire?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
$query->getSingleResult()
, qui va lever une exception si plus d'un résultat est trouvé, ou si aucun résultat n'est trouvé. (reportez-vous à la phpdoc ici https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791)Il y a aussi le moins connu
$query->getOneOrNullResult()
qui va lever une exception si plus d'un résultat, et de retourner la valeur null si aucun résultat n'est trouvé. (reportez-vous à la phpdoc ici https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752)->getOneOrNullResult(Query::HYDRATE_ARRAY)
Les deux
getSingleResult()
etgetOneOrNullResult()
va lever une exception si il n'y a plus d'un résultat.Pour résoudre ce problème, vous pouvez ajouter
setMaxResults(1)
à votre générateur de requêtes.SetMaxResults(1)
avec un NativeQuery, cette méthode n'est pas pris en charge docs pour la version 2.3.setMaxResults(1)
) qui devrait aboutir à cette affirmation est fausse, alors vous pourriez être de masquer un problème plus insidieux avec votre modèle de données ou de l'application. Juste pour info.->getOneOrNullResult(Query::HYDRATE_ARRAY)
->getSingleScalarResult() retourne une valeur unique, au lieu d'un tableau.
implique que vous vous attendez à une seule ligne à être retourné. Afin de s'adapter à votre requête, par exemple
(et ensuite utiliser
getSingleResult()
comme recommandé par AdrienBrault) ou extraire des lignes dans un tableau et l'accès au premier élément:Pour aller chercher seule ligne
Pour extraire tous les enregistrements
Ici, vous pouvez utiliser sql native de la requête, tout fonctionne sans aucun problème.