Получить результат одной строки с помощью Doctrine NativeQuery
Я пытаюсь получить одну строку, возвращаемую из собственного запроса с помощью Doctrine. Здесь мой код:
$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();
Эта последняя строка возвращает список игроков, но мне просто нужен один результат. Как это сделать?
Ответы
Ответ 1
Вы можете использовать $query->getSingleResult()
, который генерирует исключение, если найдено более одного результата или если результат не найден. (см. связанный phpdoc здесь https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791)
Там также менее известный $query->getOneOrNullResult()
, который генерирует исключение, если найдено более одного результата, и возвращает null, если результат не найден. (см. связанный phpdoc здесь https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752)
Ответ 2
Оба getSingleResult()
и getOneOrNullResult()
генерируют исключение, если имеется более одного результата.
Чтобы устранить эту проблему, вы можете добавить setMaxResults(1)
в свой конструктор запросов.
$firstSubscriber = $entity->createQueryBuilder()->select('sub')
->from("\Application\Entity\Subscriber", 'sub')
->where('sub.subscribe=:isSubscribe')
->setParameter('isSubscribe', 1)
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
Ответ 3
- > getSingleScalarResult() вернет одно значение вместо массива.
Ответ 4
Мне нужен только один результат
означает, что вы ожидаете возвращения только одной строки. Поэтому либо адаптируйте свой запрос, например.
SELECT player_id
FROM players p
WHERE CONCAT(p.first_name, ' ', p.last_name) = ?
LIMIT 0, 1
(а затем используйте getSingleResult()
в соответствии с рекомендациями AdrienBrault) или извлеките строки в виде массива и получите доступ к первому элементу:
// ...
$players = $query->getArrayResult();
$myPlayer = $players[0];
Ответ 5
Чтобы выбрать одну строку
$result = $this->getEntityManager()->getConnection()->fetchAssoc($sql)
Чтобы получить все записи
$result = $this->getEntityManager()->getConnection()->fetchAll($sql)
Здесь вы можете использовать собственный запрос sql, все будет работать без каких-либо проблем.