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 ▶}
]
私はどんな間違いをしましたか?
findAll()
メソッドにはパラメーターがありません。たとえば、リポジトリのcreateQueryBuilder()
メソッドを使用して、やりたいことを実現できます。
use Doctrine\ORM\Query;
// ...
$query = $this->getDoctrine()
->getRepository('CoreBundle:Categories')
->createQueryBuilder('c')
->getQuery();
$result = $query->getResult(Query::HYDRATE_ARRAY);
$query->getArrayResult()
へのショートカットとして$query->getResult(Query::HYDRATE_ARRAY)
を使用することができます
私はこの機能を作りました:
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オブジェクトの場合(そして単一のオプションが設定されていない場合) )完了するまで関数を再帰的に呼び出します。パラメータが配列の場合、関数はそれを通過し、すべての値に対してメソッドを再度呼び出します。
使い方は簡単ですが、すべての状況でテストされているわけではありません。
DQL SELECTクエリの結果が返される形式は、いわゆる_hydration mode
_の影響を受ける可能性があるため、findAll()
では使用できません。以下で試してみてください。
_$em = $this->getDoctrine()->getManager();
$result = $em->createQuery('select m from CoreBundle:Categories m')
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
_