如何在 findAll() - Doctrine 中获取数组结果?

Posted

技术标签:

【中文标题】如何在 findAll() - Doctrine 中获取数组结果?【英文标题】:How to get Array Results in findAll() - Doctrine? 【发布时间】:2017-08-12 03:27:43 【问题描述】:

我需要在 Doctrine 中使用 findAll() 将数据库中的所有记录作为数组获取,我的查询是这样的

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

即使将 Hydration Mode 设置为 HYDRATE_ARRAY,我也会将结果作为对象获得

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

我犯了什么错误?

【问题讨论】:

【参考方案1】:

findAll() 方法没有任何参数。例如,您可以使用存储库的 createQueryBuilder() 方法来实现您想要做的事情:

use Doctrine\ORM\Query;

// ...

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

【讨论】:

谢谢,但是我得到了 createQueryBuilder() 的参数异常,在我通过参数 ('c') 后,我得到了结果。甚至 $query->getArrayResult() 也给出相同的结果 对不起。事实上,我忘记将别名传递给 createQueryBuilder() 方法。我修正了我的答案。 你还要加use Doctrine\ORM\Query;【参考方案2】:

可以使用$query->getArrayResult() 作为$query->getResult(Query::HYDRATE_ARRAY)的快捷方式

doctrine hydration modes

【讨论】:

更好的方法,避免导入更多的类【参考方案3】:

返回 DQL SELECT 查询结果的格式可能会受到所谓的hydration mode 的影响 所以你不能将它用于findAll()。你可以试试下面这个:

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

【讨论】:

【参考方案4】:

我做了这个功能:

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

如果您发现一些升级,请告诉我。

对该函数的更多解释:它获取数组的教义对象,如果是对象,则读取所有get的方法以获取所有值,如果此值是另一个教义对象(并且未设置单个选项),则调用该函数递归直到完成。 如果参数是一个数组,函数将遍历它并再次调用该方法以获取它的所有值。

它易于使用,但并未在所有情况下都经过测试。

【讨论】:

请为您的代码添加一些解释 - 为什么要使用它?请记住,其他人应该能够从该代码中学习 添加了一点解释。 :) 感谢您的评论 补水成本很高。如果您只需要数组,请不要对对象进行水合。

以上是关于如何在 findAll() - Doctrine 中获取数组结果?的主要内容,如果未能解决你的问题,请参考以下文章

使用doctrine中的findAll选择不同的结果

Doctrine 存储库返回空结果集

避免 Doctrine 返回完整的相关实体

带有 findAll() 方法的 Knp 分页器

可捕获致命错误的 FindAll() 结果:DateTime 类的对象无法转换为字符串

如何在 Doctrine 中创建关系