web-dev-qa-db-ja.com

Doctrine2のクエリ結果でコレクションを取得する方法

Doctrine2を使用してクエリを実行しようとしていますが、コレクションオブジェクトを返す必要があります。

簡略化されたスニペット:

$players = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

返されるオブジェクトはPlayerの配列です。

クエリ結果の形式 に関する情報は次のとおりです。

結果は、オブジェクトの単純なコレクション(純粋)またはオブジェクトが結果行にネストされている配列(混合)のいずれかです。

結果の型は何に依存し、どのようにしてコレクションオブジェクトを取得できますか?

32
mkraemer

getResult()は常に配列を返します。コレクションが必要な場合、getResult()によって返される配列をDoctrineのArrayCollectionに渡す必要があります

例えば.

use Doctrine\Common\Collections;

$result = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

$players = new Collections\ArrayCollection($result);
60
chriswoodford

配列の代わりにオブジェクトを返すには、「部分オブジェクト」を使用する必要があります。

ここにテストされたコード例があります https://stackoverflow.com/a/12044461/117887

1
ismaail E.G.

「p」オブジェクトのみを選択し(個々の列または集計値は選択せず)、ハイドレーションモードにgetResult()を使用しているため、クエリは配列ではなく純粋なオブジェクトを返す必要があります。

私の最良の推測は、問題はクエリを構築するために使用している短縮構文に関係しているということです。私が最初に試したいのは、次のようなクエリ「長い形式」を書き出すことです。

$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();

$qb->select('p')
   ->from('...\Player', 'p');

$query = $qb->getQuery();
$players = $query->getResult();

私はあなたの速記のアプローチはうまくいくと思っていたでしょうが、メソッドの連鎖に関してはDoctrineはややこしいことに気付きました。

スニペットの単純化の程度に応じて、考慮すべき点が他にもいくつかあります。しかし、私の経験では、示されているように記述されたクエリはPlayerオブジェクトを返します。

1
cantera