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



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

$result = $this->getDoctrine()
                ->getRepository('CoreBundle:Categories')
                ->findAll(DoctrineORMQuery::HYDRATE_ARRAY);

即使将水合模式设置为 HYDRATE_ARRAY ,也会将结果作为对象

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

我犯了什么错误?

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

use DoctrineORMQuery;
// ...
$query = $this->getDoctrine()
    ->getRepository('CoreBundle:Categories')
    ->createQueryBuilder('c')
    ->getQuery();
$result = $query->getResult(Query::HYDRATE_ARRAY);
可以使用

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

学说水化模式

返回 DQL SELECT 查询结果的格式可能受到所谓的hydration mode所以你不能用它来findAll()你可以试试下面:

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

抱歉,我在多年后唤醒了这个旧话题,但我发现 JMS 序列化程序提供的解决方案非常优雅,可以将 Doctrine 对象的数组转换为关联数组(例如 JSON(,而无需切割/重写您的存储库 findAll(( 方法。

我认为这可能会对这里的一些人有所帮助,因为 JMS 是一个非常易于配置的轻量级框架。

要使用的代码片段如下所示:

     $serializer = SerializerBuilder::create()->build();
     $employees = getEmployeeRepo->findAll();
     $arrEmployees = $serializer->toArray($employees);

我已经做了这个函数:

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 的方法以获取所有值,如果这个值是另一个教义对象(并且未设置单个选项(它递归调用函数直到完成。如果参数是一个数组,则该函数将遍历它并再次调用该方法以获取其所有值。

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

相关内容

  • 没有找到相关文章

最新更新