2015-06-23 51 views
0

我想将我的symfony 2项目从2.3升级到2.7 LTS版本。我在存储库中遇到问题以获取查询结果。在2.3中,这个查询给我的东西:获取ArrayCollection的内容

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; 

    } 

但是这段代码不能在早期版本的工作,因为$在ArrayCollection酒馆变量。所以我改变了我的代码与本月底:

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

     return $publications; 

在这一部分,当我转储$酒馆变量,我有:

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) 
    } 
    } 
} 

如此看来,有这个ArrayCollection的元素,但测试$ 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;}}} 

和功能findProtectedPublications()的作品没有错误。

两个版本之间的区别是第一个是ArrayCollection_elements,第二个是ArrayCollectionelements。

要纠正这个数据,我试着用

UPDATE demand SET pub_refs = REPLACE (pub_refs, "ArrayCollection_elements', 'ArrayCollectionelements') 

但这并不因为特殊字符的工作。试用

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

不能正常工作。我怎样才能纠正这些数据?

+0

这不是一个解决方案,而是一个提示。您可以更好地在Demand实体上运行查询,而不是Event实体。结果将是一系列需求,然后您不需要遍历事件来获取需求。它会简化你的方法。 –

回答

2

学说可以填充结果作为数组,而不是一个ArrayCollection,简单地改变getResult()呼吁:

$results = $query->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY); 

这将是最有效的方式来完成你的任务,但是你也可以使用ArrayCollection中的内置由于问题似乎是

$publications = $results->toArray(); 
+0

感谢您的回复。我的$ results ans $结果变量已经是数组,但$ result ['pubrefs']是arrayCollection。当我尝试使用这个'$ arrayPubs = $ pubs-> toArray()'将数组转换为数组时,我在数组中得到任何东西,并且在我尝试对数组进行迭代时为foreach()提供了无效参数。 – Lucuhb

0

由于ArrayCollection中的存储在数据库2.3和2.7版本的symfony的,我CREA之间的变化:toArray()方法到它自己的数据转换为阵列形式用一条线命令在数据库中更新这些命令。