2015-06-23 2 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() дает истинный результат, поэтому в массиве $ публикаций нет ничего.

Edit: На самом деле, проблема, кажется, из-за мои данные в базе данных: для объекта предыдущего моего обновления, у меня быть_наст что-то вроде этого в базе данных:

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

Это не решение, а подсказка. Вы можете лучше выполнить запрос в объекте «Спрос» вместо объекта «Событие». Результатом будет множество требований, и тогда вам не нужно перебирать события, чтобы получить требования. Это упростит ваш метод. –

ответ

2

Учение может заполнить результаты как массив вместо ArrayCollection, просто изменить getResult() вызов:

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

Это было бы наиболее эффективным способом, чтобы завершить задачу, однако вы также можете использовать ArrayCollection встроенный toArray() способ конвертировать свои данные в формат массива:

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

Спасибо за ваш ответ. Мои $ results ans $ result переменные уже являются массивами, но $ result ['pubrefs'] - arrayCollection. Когда я пытаюсь преобразовать его в массив с этим '$ arrayPubs = $ pubs-> toArray()', я ничего не получаю в массиве и имею аргумент Invalid для foreach(), когда я пытаюсь выполнить итерацию по массиву:. – Lucuhb

0

Поскольку проблема, как представляется, в связи с изменением хранения ArrayCollection в базе данных между 2.3 и 2.7 версии Symfony, я мето чтобы обновить их в базе данных.

Смежные вопросы