2015-06-23 49 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()方法到它自己的數據轉換爲陣列形式用一條線命令在數據庫中更新這些命令。