2016-09-27 1 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呼び出しで使用されます。

ページリフレッシュカウント()は、正しい番号を返します。

誰かが問題を明らかにすることができれば、それを感謝します。 flushは0 urlsを意味し、実行された前のphpはまだその状態を持っている - あなたは$em->flush()を行うということは、データベース操作が実行されることを意味しますが、それはあなたの$urlGroupオブジェクトがリフレッシュされることを意味するものではありませんので、

答えて

1

です。

$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); 
    } 
} 

たぶん$urls上記ArrayCollectionのインスタンスです。

これは、マッピングのinverse側の関係を修正します。このようにすることを強くお勧めします。

関連する問題