web-dev-qa-db-ja.com

Doctrine2結果オブジェクトを連想配列として取得する方法は?

ユーザーデータを保持するテーブルである単純なエンティティがあり、特定のユーザーのすべての列を配列としてフェッチしてからjson_encodeを実行しますが、取得するのはエンティティオブジェクトで、すべての値に対してgetメソッドを使用する必要があります。ユーザーテーブルの値の連想配列が欲しいだけです。私が試したが機能しなかったコード(返されたエンティティオブジェクト)は次のとおりです。

$qb = $this->em->createQueryBuilder();
$qb->add('select', 'a')
->add('from', 'Entities\Adminprofile a')
->add('where', 'a.userid = 3333');
$accounts = $qb->getQuery()->getResult();

2。

$account = $this->em->getRepository('Entities\Adminprofile')->findOneBy(
array('userid' => '3333'));

PS:私はzend 2フレームワークへのdoctrine2統合であるz2d2プロジェクトを使用しています。

19
Mehdi Fanai

$accounts = $qb->getQuery()->getResult();を実行すると、getResultに渡す引数は、返される結果セットをハイドレートする方法を示します。

配列ハイドレーション

配列が必要な場合は、配列ハイドレーション用にCONSTANTを渡す必要があります_Doctrine\ORM\Query::HYDRATE_ARRAY_。

$ accounts = $ qb-> getQuery()-> getResult(Doctrine\ORM\Query :: HYDRATE_ARRAY);

findOneBy()を使用している場合は、常に常にエンティティが返されます。 findのしくみの内部構造により、エンティティを返す以外の方法で水和するように指示することはできません。

このシナリオでは、次のようにエンティティの配列を返すgetValues()メソッドをエンティティ内に作成する必要があります。

_ public function getSimpleValues(){
     return array(
        'id'      => $this->getId(),
        'lft'     => $this->getLft(),
        'rgt'     => $this->getRgt(),
        'name'    => $this->getName(),
        'md5Name' => $this->getMd5Name(),              
        'owner'   => $this->getOwner()->getId(),
        'etag'    => $this->getEtag()
    );
}
_

ハイドレーションAPIドキュメント: http://www.doctrine-project.org/api/orm/2.1/namespace-Doctrine.ORM.Internal.Hydration.html

36
Layke

また、getArrayResult()を定数として渡して配列を取得するショートカットとして使用することもできます。

$accounts = $qb->getQuery()->getArrayResult();
23
Jeremy Hicks

値2を含む定数を使用する必要があり、それは組み込みです。クエリの最後の部分でこのように行うことができます

$qb->getQuery()->getResult( Doctrine\ORM\Query::HYDRATE_ARRAY );
7
Jaskaran Singh
$data = $this->entity->findOneBy(array('key' => $value));

$hydrator = new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($this->_em, $entity_name);

$array = $hydrator->extract($data);
1
user2519925