Erhalten Sie ein einzelnes Zeilenergebnis mit Doctrine NativeQuery

Lesezeit: 3 Minuten

Benutzer-Avatar
Jason Swett

Ich versuche, eine einzelne Zeile von einer nativen Abfrage mit Doctrine zurückzugeben. Hier ist mein 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();

Diese letzte Zeile gibt eine Liste von Spielern zurück, aber ich möchte nur ein Ergebnis. Wie mache ich das?

Benutzer-Avatar
Adrian Brault

Sie können verwenden $query->getSingleResult(), die eine Ausnahme auslöst, wenn mehr als ein Ergebnis gefunden wird oder wenn kein Ergebnis gefunden wird. (siehe das zugehörige phpdoc hier https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791)

Es gibt auch die weniger berühmten $query->getOneOrNullResult() die eine Ausnahme auslöst, wenn mehr als ein Ergebnis gefunden wird, und null zurückgibt, wenn kein Ergebnis gefunden wird. (siehe das zugehörige phpdoc hier https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752)

  • Schön, wusste noch nicht einmal von getOneOrNullResult, aber das ist ziemlich hilfreich!

    – Aaron Lozier

    24. Juli 2014 um 23:50 Uhr

  • Wenn Sie Ergebnis in einem Array wollen: ->getOneOrNullResult(Query::HYDRATE_ARRAY)

    – Omar Tarik

    12. Dezember 2018 um 12:32 Uhr

Beide getSingleResult() und getOneOrNullResult() löst eine Ausnahme aus, wenn es mehr als ein Ergebnis gibt. Um dieses Problem zu beheben, könnten Sie hinzufügen setMaxResults(1) zu Ihrem Abfragegenerator.

 $firstSubscriber = $entity->createQueryBuilder()->select('sub')
        ->from("\Application\Entity\Subscriber", 'sub')
        ->where('sub.subscribe=:isSubscribe')
        ->setParameter('isSubscribe', 1)  
        ->setMaxResults(1)
        ->getQuery()
        ->getOneOrNullResult();

  • Für alle, die versuchen, zu verwenden SetMaxResults(1) bei einer NativeQuery wird diese Methode nicht unterstützt docs für Version 2.3.

    – Tomás Kinderbett

    28. Juni 2017 um 17:44 Uhr

  • Eine Sorge, die ich für diese Lösung habe – wenn Sie beide behaupten, dass es 0 oder 1 Ergebnisse geben sollte, aber dann die Ausnahme schlucken (via setMaxResults(1)), was dazu führen sollte, dass diese Behauptung falsch ist, verbergen Sie möglicherweise ein heimtückischeres Problem mit Ihrem Datenmodell oder Ihrer Anwendung. Nur zur Info.

    – MSC

    13. November 2017 um 17:14 Uhr


  • Wenn Sie Ergebnis in einem Array wollen: ->getOneOrNullResult(Query::HYDRATE_ARRAY)

    – Omar Tarik

    12. Dezember 2018 um 12:32 Uhr

  • Hier nur ein entscheidender Unterschied. Für diejenigen, die verwirrt sind, welche sie verwenden sollen: getSingleResult() vs getOneOrNullResult(). getSingleResult() wirft einen Fehler, wenn keine Zeilen gefunden werden. aber für getOneOrNullResult() es wird ein Nullwert zurückgegeben!

    – ezennnn

    gestern

->getSingleScalarResult() gibt einen einzelnen Wert anstelle eines Arrays zurück.

  • Das ist, wonach ich für meine Abfrage SELECT MIN (Datum) … gesucht habe. Gibt das Datum ohne Array zurück. Vielen Dank.

    – Strabek

    12. Februar 2017 um 6:39 Uhr

Ich will nur ein Ergebnis

impliziert, dass Sie erwarten, dass nur eine Zeile zurückgegeben wird. Passen Sie also entweder Ihre Abfrage an, z

SELECT player_id
FROM players p
WHERE CONCAT(p.first_name, ' ', p.last_name) = ?
LIMIT 0, 1

(und dann verwenden getSingleResult() wie von AdrienBrault empfohlen) oder Zeilen als Array abrufen und auf das erste Element zugreifen:

// ...
$players = $query->getArrayResult();
$myPlayer = $players[0];

Ich benutze fetchObject() hier ein kleines Beispiel mit Symfony 4.4

    <?php 
    use Doctrine\DBAL\Driver\Connection;

    class MyController{

    public function index($username){
      $queryBuilder = $connection->createQueryBuilder();
      $queryBuilder
        ->select('id', 'name')
        ->from('app_user')
        ->where('name = ?')
        ->setParameter(0, $username)
        ->setMaxResults(1);
      $stmUser = $queryBuilder->execute();

      dump($stmUser->fetchObject());

      //get_class_methods($stmUser) -> to see all methods
    }
  }

Antwort:

{ 
"id": "2", "name":"myuser"
}

Benutzer-Avatar
Alpesh Panchal

Zum Abrufen einer einzelnen Zeile

$result = $this->getEntityManager()->getConnection()->fetchAssoc($sql)

Um alle Datensätze abzurufen

$result = $this->getEntityManager()->getConnection()->fetchAll($sql)

Hier können Sie eine native SQL-Abfrage verwenden, alles funktioniert ohne Probleme.

1333010cookie-checkErhalten Sie ein einzelnes Zeilenergebnis mit Doctrine NativeQuery

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy