I'm trying to get a single row returned from a native query with Doctrine. Here's my 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();
That last line returns a list of players but I just want one result. How do I do that?
->getSingleScalarResult() will return a single value, instead of an array.
implies that you expect only one row to be returned. So either adapt your query, e.g.
(and then use
getSingleResult()
as recommended by AdrienBrault) or fetch rows as an array and access the first item:To fetch single row
To fetch all records
Here you can use sql native query, all will work without any issue.
You can use
$query->getSingleResult()
, which will throw an exception if more than one result are found, or if no result is found. (see the related phpdoc here https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791)There's also the less famous
$query->getOneOrNullResult()
which will throw an exception if more than one result are found, and return null if no result is found. (see the related phpdoc here https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752)Both
getSingleResult()
andgetOneOrNullResult()
will throw an exception if there is more than one result. To fix this problem you could addsetMaxResults(1)
to your query builder.