web-dev-qa-db-ja.com

Doctrine 2で配列の代わりにクラスをフェッチする方法

この構造を使用して、データベースからデータをフェッチできます。

$user = $this->getDoctrine()
->getRepository('AcmeDemoBundle:Emails')
->find(8081);

そうすると、次のようなデータを取得できます。

$user->getColumnNameHere();

基本的に私はエンティティクラスを使用することができます。

しかし、findの代わりにQueryBuilderを使用したい場合は、連想配列しか取得できません。

$product->createQueryBuilder('p')
        ->setMaxResults(1)
        ->where('p.idx = :idx')
        ->select('p.columnNameHere')
        ->setParameter('idx', 8081)
        ->orderBy('p.idx', 'DESC')
        ->getQuery();
        $product = $query->getResult();

$ productは配列として返されます。 Entity Managaer Classでフェッチすることはできますか?はいの場合、どのように?

私はドキュメントを掘り起こしましたが、それは不可能であるか、ドキュメントに存在しないか、私はただ盲目です:)

15
flower58

はい、できます。通常は次を使用します。

$repository
    ->createQueryBuilder('p')
    ->getQuery()
    ->execute()
;

これにより、エンティティの配列が返されます。

単一のエンティティの結果を取得する場合は、getSingleResultまたはgetOneOrNullResultのいずれかを使用します。

$repository
    ->createQueryBuilder('p')
    ->getQuery()
    ->getOneOrNullResult()
;

警告:これらのメソッドはNonUniqueResultExceptionをスローする可能性があります。

編集:わかりました、質問は部分的なオブジェクトについてでした: http://docs.doctrine-project.org/en/latest/ reference/partial-objects.html

24
Florian

「部分オブジェクト」を使用すると、配列の代わりにオブジェクトを取得できます。

doctrineORM2.2.2でテストした例を次に示します。

// create query builder
// $em is the EntityManager
$qb    = $em->createQueryBuilder();

// specify the fields to fetch (unselected fields will have a null value)
$qb->select  ('partial p.{id,pubDate,title,summary}')
   ->from    ('Project\Entity\Post', 'p')
   ->where   ('p.isActive = 1')
   ->orderBy ('p.pubDate', 'desc');

$q      = $qb->getQuery();

$result = $q->getResult();
var_dump($result); // => object
18
ismaail E.G.

元のクエリからオブジェクトを返したい場合:

    $product->createQueryBuilder('p')
    ->setMaxResults(1)
    ->where('p.idx = :idx')
    ->select('p.columnNameHere')
    ->setParameter('idx', 8081)
    ->orderBy('p.idx', 'DESC')
    ->getQuery();
    $product = $query->getResult();

この行を削除

->select('p.columnNameHere')

Selectを使用するとすぐに、配列が返されます...

6
HappyCoder

getResult()メソッドは、エンティティのコレクション(配列)を返します。オブジェクトを1つだけフェッチする場合は、getSingleResult()を使用します。

編集:

ああ、私はあなたが単一のオブジェクトの単一のフィールドをフェッチしたいことに気づきました。 @Florianが示唆するように、getSingleScalarResult()を使用します。

4
Crozin