58

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 つの結果だけが必要です。それ、どうやったら出来るの?

4

6 に答える 6

106

を使用できます$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 )

于 2012-07-05T23:42:59.030 に答える
85

複数の結果がある場合、 と の両方が例外をスローし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();
于 2015-08-23T17:32:20.003 に答える
5

1つの結果だけが欲しい

1 行だけが返されることを期待していることを意味します。したがって、クエリを調整するか、たとえば

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];
于 2013-08-05T07:16:31.890 に答える
-1

単一の行をフェッチするには

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

すべてのレコードを取得するには

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

ここでは、SQL ネイティブ クエリを使用できます。すべて問題なく動作します。

于 2017-01-11T14:30:47.313 に答える