ZF2 和原则 2 将结果集转换为数组


ZF2 and Doctrine 2 convert resultset to Array

我将 Zend Framework 2 与 Doctrine 2 一起使用。这是我的问题

下面返回对象数组

$results = $em->getRepository('MyProject'Domain'User')->find($id);

返回:

array (size=4)
  0 => 
    object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)
  1 =>
      object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)
  3 => 
    object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)
  4 =>
      object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)

我想像这样将其转换为数组数组:

array (size=4)
      0 =>
      array (size=3)
      ['id'] => int 1
      ['firstName'] => string 'joe' (length=3)
      ['lastName'] => string 'smith' (length=5)
      1 =>
      array (size=3)
      ['id'] => int 1
      ['firstName'] => string 'joe' (length=3)
      ['lastName'] => string 'smith' (length=5)
      2 =>
      array (size=3)
      ['id'] => int 1
      ['firstName'] => string 'joe' (length=3)
      ['lastName'] => string 'smith' (length=5)
      3 =>
      array (size=3)
      ['id'] => int 1
      ['firstName'] => string 'joe' (length=3)
      ['lastName'] => string 'smith' (length=5)

我尝试了以下方法:

$resultsArray = new 'Doctrine'Common'Collections'ArrayCollection($results);
$resultsArray->toArray();
$resultsArray = new 'Zend'Stdlib'ArrayObject($results);
$resultsArray->getArrayCopy();

两者都返回以下内容:

array (size=4)
  0 => 
    object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)
  1 =>
      object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)
  3 => 
    object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)
  4 =>
      object(My'Entity'User)[3]
      private 'id' => int 1
      private 'firstName' => string 'joe' (length=3)
      private 'lastName' => string 'smith' (length=5)

我怎样才能做到这一点?推荐的方法是什么?

在最简单的形式中,以下内容可以满足您的需求

$qb = $em->getRepository('My'Entity'User')->createQueryBuilder('User');
$result = $qb->getQuery()->getArrayResult();

通常,您将使用自定义存储库并将 DQL 查询添加为方法,如文档中此处所述

http://docs.doctrine-project.org/en/2.0.x/tutorials/getting-started-xml-edition.html#entity-repositories

另一种编码方法,我使用:

//at the top of custom repository class
use Doctrine'Orm'Query;
//in the method
$dql = "SELECT u FROM MyProject'Domain'User u WHERE u.id = $id"
$query =  $entityManager->createQuery($dql);
$users = $query->getResult(Query::HYDRATE_ARRAY);
//knowing the code you provided, this should give you an array of four arrays

传统上,我编写一个自定义存储库类并在其中调用一个getArrayResult()

        $dql = 'MYDQLHERE';
        $query = $this->getEntityManager()->createQuery($dql);
        $query->execute();
        $result =  $query->getArrayResult();

我相信您的另一个选择是自定义补水模式,尽管我没有使用它们的经验。 http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes