Подтвердить что ты не робот

Получить результат одной строки с помощью 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();

Эта последняя строка возвращает список игроков, но мне просто нужен один результат. Как это сделать?

4b9b3361

Ответ 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, все будет работать без каких-либо проблем.