2016-09-27 16 views
0

У меня есть следующий код:Почему не считается возвратом правильного количества элементов в коллекции Doctrine?

$em = $this->getDoctrine()->getManager(); 
      if($groupType == 'existing'){ 
       $urlGroup = $em->getRepository('UrlBuilderBundle:UrlGroup')->find($groupId); 
      }elseif($groupType == 'new'){ 
       $urlGroup = new UrlGroup(); 
       $groupName = $submittedData['groupName']; 
       $urlGroup->setName($groupName); 
       $em->persist($urlGroup); 
      } 

      $url = new Url(); 
      $url->setName($name); 
      $url->setAuthorUser($authorUser); 
      $url->setUrl($generatedUrl); 
      $url->setUrlGroup($urlGroup); 

      $em->persist($url); 
      $em->flush(); 

      $urlGroupName = $urlGroup->getName(); 
      $urlCount = count($urlGroup->getUrls()); 

Когда новый UrlGroup создается, последняя строка (количество дочерних объектов URL) всегда возвращает ноль, даже если URL был добавлен для данного UrlGroup. Этот код используется в вызове AJAX.

При обновлении страницы count() возвращает правильный номер.

Оцените это, если кто-нибудь может помочь пролить свет на проблему.

ответ

1

Это потому, что то, что вы делаете $em->flush() означает, что операция базы данных выполняется, но это не значит, что ваш $urlGroup объект обновляется - PHP все еще имеет свое состояние до flush было выполнено, то есть с 0 urls.

Попробуйте позвонить:

$em->refresh($urlGroup) 

сразу после $em->flush. Это обновит $urlGroup с информацией из базы данных

0

Я думаю, что принятый ответ немного вводит в заблуждение - да, вы обновите объект своей коллекцией, но, на мой взгляд, это обходное решение. В общем случае flush дает идентификаторы (id) вашей модели.

Вы звоните $url->setUrlGroup($urlGroup); на стороне owning, но не обновляете сторону inverse. Что должно быть сделано в setUrlGroup методе в Url классе:

public function setUrlGroup($group) 
{ 
    $this->urlGroup = $group; 
    $group->addUrl($this); 
} 

и почтительно в UrlGroup классе:

public function addUrl($url) 
{ 
    if (!$this->$urls->contains($url) { 
     $this->$urls->add($url); 
    } 
} 

Supposedly $urls выше пример ArrayCollection.

Это фиксирует отношение на стороне отображения вашего изображения inverse. Я бы настоятельно рекомендовал это сделать.