【问题标题】:How to get Array Results in findAll() - Doctrine?如何在 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 ▶}
]

我犯了什么错误?

【问题讨论】:

    标签: symfony doctrine-orm doctrine-query


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

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

      【讨论】:

      • 请为您的代码添加一些解释 - 为什么要使用它?请记住,其他人应该能够从该代码中学习
      • 添加了一点解释。 :) 感谢您的评论
      • 补水成本很高。如果您只需要数组,请不要对对象进行水合。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多