2016-09-27 2 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 객체의 카운트) 항상 URL이 주어진 UrlGroup에 추가 된 경우에도 0을 반환합니다. 이 코드는 AJAX 호출에 사용됩니다.

페이지 새로 고침 횟수()는 올바른 숫자를 반환합니다.

누구든지 문제를 해결할 수 있다면 감사하게 생각하십시오.

답변

1

이것은 당신이 $em->flush() 데이터베이스 작업을 수행하지만, 그것은 당신의 $urlGroup 개체를 새로 고칠 것을 의미하지 않는다는 것을 의미 할 수 있다는 사실 때문에 - flush이 수행되기 전에 PHP는 여전히 0 urls와 의미, 그 상태를 가지고있다.

$em->refresh($urlGroup) 

바로 $em->flush 후 :

호출하려고합니다. 이 새로 고침 $urlGroup 정보 데이터베이스

0

나는 받아 들인 대답은 약간 오도 된 것 - 네, 당신은 그것의 컬렉션과 함께 개체를 새로 고칠 것이라고 생각하지만, 이것은 일시적인 해결책입니다. 일반적으로 flush은 모델에 대한 식별자 (ID)를 제공합니다.

owning 쪽에서 $url->setUrlGroup($urlGroup);을 호출 중이지만 inverse 쪽은 업데이트하지 않았습니다. Url 클래스 setUrlGroup 방법으로 수행 될 필요가 무엇 : 정중

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 쪽의 관계가 수정되었습니다. 이런 식으로하는 것이 좋습니다.