web-dev-qa-db-ja.com

findAll()で配列の結果を取得する方法-Doctrine?

DoctrineでfindAll()を使用してデータベースのすべてのレコードを配列としてフェッチする必要があります、私のクエリはこのようなものです

$result = $this->getDoctrine()
                ->getRepository('CoreBundle:Categories')
                ->findAll(\Doctrine\ORM\Query::HYDRATE_ARRAY);

ハイドレーションモードをHYDRATE_ARRAYに設定しても、結果をオブジェクトとして取得しています

array:4 [▼
0 => Categories {#323 ▶}
1 => Categories {#326 ▶}
2 => Categories {#329 ▶}
3 => Categories {#332 ▶}
]

私はどんな間違いをしましたか?

6
HariHaraSudhan

findAll()メソッドにはパラメーターがありません。たとえば、リポジトリのcreateQueryBuilder()メソッドを使用して、やりたいことを実現できます。

use Doctrine\ORM\Query;

// ...

$query = $this->getDoctrine()
    ->getRepository('CoreBundle:Categories')
    ->createQueryBuilder('c')
    ->getQuery();
$result = $query->getResult(Query::HYDRATE_ARRAY);
12
xabbuh

$query->getArrayResult()へのショートカットとして$query->getResult(Query::HYDRATE_ARRAY)を使用することができます

ドクトリン水和モード

4
Pascal KOCH

私はこの機能を作りました:

https://Gist.github.com/AndreiLN/3708ab829c26cee4711b1df551d1385f

/** 
 * Converte um objeto Doctrine para um array
 * @param $dados
 * @param $single define se é uma única execução (Sem recursividade)
 * @return array
*/
public function doctrine_to_array($data, $single = false) {
    if (is_object($data)) { // Verifica se é array ou objeto
        $methods = get_class_methods($data);
        $methods = array_filter($methods, function($val){ return preg_match('/^get/', $val); });

        $return = [];
        if(count($methods)){
            foreach($methods as $method){
                $prop = lcfirst(preg_replace('/^get/', "", $method));
                $val = $data->$method();

                if(!$single){
                    $return[$prop] = $this->doctrine_to_array($val, $single);
                } else {
                    if(!is_array($val) && !is_object($val)){
                        $return[$prop] = $val;
                    }
                }
            }
        }
        return $return;
    } else if(is_array($data)){
        if(count($data)){
            foreach($data as $idx => $val){
                $data[$idx] = $this->doctrine_to_array($val, $single);
            }
        }
    }
    return $data; // Retorna o próprio valor se não for objeto
}

アップグレードを見つけた場合はお知らせください。

この関数の詳細を説明する:配列のdoctrineオブジェクトを取得します。それがオブジェクトの場合、すべてのgetメソッドを読み取ってすべての値を取得します。この値が別のdoctrineオブジェクトの場合(そして単一のオプションが設定されていない場合) )完了するまで関数を再帰的に呼び出します。パラメータが配列の場合、関数はそれを通過し、すべての値に対してメソッドを再度呼び出します。

使い方は簡単ですが、すべての状況でテストされているわけではありません。

0

DQL SELECTクエリの結果が返される形式は、いわゆる_hydration mode_の影響を受ける可能性があるため、findAll()では使用できません。以下で試​​してみてください。

_$em = $this->getDoctrine()->getManager();
$result = $em->createQuery('select m from CoreBundle:Categories m')
        ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
_
0
yang