Symfony 获取ArrayCollection的内容

Symfony 获取ArrayCollection的内容,symfony,doctrine-orm,arraycollection,Symfony,Doctrine Orm,Arraycollection,我想将我的symfony 2项目从2.3升级到2.7 LTS版本。我在获取查询结果的存储库中遇到问题。在2.3中,这个查询提供了一些信息: public function findProtectedPublications( $steps, $start, $end) { $query= $this->getEntityManager() ->createQueryBuilder() ->select('d.pu

我想将我的symfony 2项目从2.3升级到2.7 LTS版本。我在获取查询结果的存储库中遇到问题。在2.3中,这个查询提供了一些信息:

    public function findProtectedPublications( $steps, $start, $end)
    {

        $query= $this->getEntityManager()
        ->createQueryBuilder()
        ->select('d.pubRefs')
        ->from('ImpressionDemandBundle:Event', 'h')
        ->innerJoin('h.demand','d')
        ->where('d.protectedPublications = :pub')
        ->setParameter('pub', 1 )   
        ->andWhere('h.date >= :start')
        ->setParameter('start', $start )
        ->andWhere('h.date <= :end')
        ->setParameter('end', $end )
        ->andWhere('h.stepId in (:steps)')
        ->setParameter('steps', $steps )
        ->orderBy('d.id','ASC')
        ->getQuery();

        $results = $query->getResult();
        $publications = array();
        if ($results && ! empty ($results)){
            foreach($results as $result){
                $pubs = $result['pubRefs'];
                if ($pubs && ! empty($pubs)){
                    foreach($pubs as $pub){
                        $publications[] = $pub;
                    }
                }
            }
        }

        return  $publications;

    }
在本部分中,当我转储$pubs变量时,我有:

    object(Doctrine\Common\Collections\ArrayCollection)#131 (2) {
  ["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
  NULL
  ["_elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
  array(1) {
    [0]=>
    object(Impression\DemandBundle\Entity\Publication)#125 (5) {
      ["editor":"Impression\DemandBundle\Entity\Publication":private]=>
      string(24) "Journal Le Monde 4-10-13"
      ["coauthors":"Impression\DemandBundle\Entity\Publication":private]=>
      string(12) "Machin Machin"
      ["title":"Impression\DemandBundle\Entity\Publication":private]=>
      string(57) "La tragédie de Lampedusa: s"émouvoir, comprendre, agir."
      ["nbPages":"Impression\DemandBundle\Entity\Publication":private]=>
      float(1)
      ["nbCopies":"Impression\DemandBundle\Entity\Publication":private]=>
      float(40)
    }
  }
}
看起来这个数组集合中有元素,但是test$pubs->isEmpty()给出了一个真实的结果,所以我在$publications数组中没有任何元素

编辑:事实上,问题似乎是由于我在数据库中的数据造成的:对于以前升级的对象,我在数据库中有如下内容:

O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:54:"Doctrine\Common\Collections\ArrayCollection_elements";a:1:{i:0;O:42:"Impression\DemandBundle\Entity\Publication":5:{s:50:"Impression\DemandBundle\Entity\Publicationeditor";s:5:"BREAL";s:53:"Impression\DemandBundle\Entity\Publicationcoauthors";s:5:"MONOT";s:49:"Impression\DemandBundle\Entity\Publicationtitle";s:18:"USA Canada mexique";s:51:"Impression\DemandBundle\Entity\PublicationnbPages";d:150;s:52:"Impression\DemandBundle\Entity\PublicationnbCopies";d:150;}}}
O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:53:"Doctrine\Common\Collections\ArrayCollectionelements";a:1:{i:0;O:42:"Impression\DemandBundle\Entity\Publication":5:{s:50:"Impression\DemandBundle\Entity\Publicationeditor";s:8:"dfg dfgd";s:53:"Impression\DemandBundle\Entity\Publicationcoauthors";s:7:"dfg dfg";s:49:"Impression\DemandBundle\Entity\Publicationtitle";s:5:"fdg d";s:51:"Impression\DemandBundle\Entity\PublicationnbPages";d:5;s:52:"Impression\DemandBundle\Entity\PublicationnbCopies";d:3;}}}
这就产生了误差。 对于升级后添加的对象,数据库中有如下内容:

O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:54:"Doctrine\Common\Collections\ArrayCollection_elements";a:1:{i:0;O:42:"Impression\DemandBundle\Entity\Publication":5:{s:50:"Impression\DemandBundle\Entity\Publicationeditor";s:5:"BREAL";s:53:"Impression\DemandBundle\Entity\Publicationcoauthors";s:5:"MONOT";s:49:"Impression\DemandBundle\Entity\Publicationtitle";s:18:"USA Canada mexique";s:51:"Impression\DemandBundle\Entity\PublicationnbPages";d:150;s:52:"Impression\DemandBundle\Entity\PublicationnbCopies";d:150;}}}
O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:53:"Doctrine\Common\Collections\ArrayCollectionelements";a:1:{i:0;O:42:"Impression\DemandBundle\Entity\Publication":5:{s:50:"Impression\DemandBundle\Entity\Publicationeditor";s:8:"dfg dfgd";s:53:"Impression\DemandBundle\Entity\Publicationcoauthors";s:7:"dfg dfg";s:49:"Impression\DemandBundle\Entity\Publicationtitle";s:5:"fdg d";s:51:"Impression\DemandBundle\Entity\PublicationnbPages";d:5;s:52:"Impression\DemandBundle\Entity\PublicationnbCopies";d:3;}}}
函数findProtectedPublications()可以正常工作

这两个版本之间的区别是,第一个版本使用ArrayCollection_元素,第二个版本使用ArrayCollectionelements元素

为了更正此数据,我尝试了

UPDATE demand SET pub_refs = REPLACE (pub_refs, "ArrayCollection_elements', 'ArrayCollectionelements')
但这不起作用,因为特殊的字符。尝试

UPDATE demand SET pub_refs = REPLACE (pub_refs, "ArrayCollection�_elements', 'ArrayCollection�elements')

没有更好的效果。如何更正此数据

如果可以将结果填充为数组而不是ArrayCollection,只需将
getResult()
调用更改为:

 $results = $query->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
这是完成任务的最有效方法,但是您也可以使用ArrayCollection的内置
toArray()
方法将其自身的数据转换为数组格式:

 $publications = $results->toArray();

由于问题似乎是由于ArrayCollection在2.3和2.7版本的symfony之间在数据库中的存储发生了更改,因此我创建了一个行命令来更新数据库中的存储。

感谢您的回复。我的$results和$result变量已经是数组,但$result['pubrefs']是arrayCollection。当我尝试使用此
$arrayPubs=$pubs->toArray()
在数组中转换它时,数组中没有任何内容,并且在尝试迭代数组时为foreach()提供了无效参数:。这不是解决方案,而是提示。您可以更好地在需求实体而不是事件实体上运行查询。结果将是一个需求数组,然后您不需要迭代事件来获得需求。它会简化你的方法。