2016-09-27 66 views
0

我有以下代碼:爲什麼不計數返回一個Doctrine Collection中正確數量的元素?

$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子對象的數量)總是返回零即使網址已被添加在給定UrlGroup。此代碼用於AJAX調用。

頁面刷新count()返回正確的數字。

欣賞它,如果任何人都可以幫助解決這個問題。

回答

1

這是因爲事實是,你做$em->flush()意味着數據庫操作的情況下,但它並不意味着你$urlGroup刷新對象 - PHP仍然有它的狀態已經進行flush前,用0 urls意義。

嘗試撥打:

$em->refresh($urlGroup) 

$em->flush之後。這將刷新$urlGroup與來自數據庫的信息

0

我認爲接受的答案有點誤導 - 是的,你會刷新對象與它的集合,但在我看來這是一個解決方法。 flush通常給出的是模型的標識符(id)。

您在owning方打電話$url->setUrlGroup($urlGroup);方,但不更新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); 
    } 
} 

上述推測$urlsArrayCollection實例。

修復了映射的inverse側的關係。我強烈建議這樣做。

相關問題