如何在 findAll() - Doctrine 中获取数组结果?
How to get Array Results in 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 ▶}
]
我犯了什么错误?
findAll()
方法没有任何参数。例如,您可以使用存储库的 createQueryBuilder()
方法来实现您想要执行的操作:
use Doctrine\ORM\Query;
// ...
$query = $this->getDoctrine()
->getRepository('CoreBundle:Categories')
->createQueryBuilder('c')
->getQuery();
$result = $query->getResult(Query::HYDRATE_ARRAY);
返回 DQL SELECT 查询结果的格式可能会受到所谓的 hydration mode
所以你不能将它用于 findAll()
。你可以在下面尝试这个:
$em = $this->getDoctrine()->getManager();
$result = $em->createQuery('select m from CoreBundle:Categories m')
->getResult(\Doctrine\ORM\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 对象(并且未设置单个选项)它调用函数递归直到完成。
如果参数是一个数组,函数将遍历它并再次调用该方法以获得它的所有值。
它易于使用,但并未在所有情况下进行测试。
我需要在 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);
返回 DQL SELECT 查询结果的格式可能会受到所谓的 hydration mode
所以你不能将它用于 findAll()
。你可以在下面尝试这个:
$em = $this->getDoctrine()->getManager();
$result = $em->createQuery('select m from CoreBundle:Categories m')
->getResult(\Doctrine\ORM\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 对象(并且未设置单个选项)它调用函数递归直到完成。 如果参数是一个数组,函数将遍历它并再次调用该方法以获得它的所有值。
它易于使用,但并未在所有情况下进行测试。