2012-09-10 43 views
1

我有兩個實體之間的多對多關係。我們稱之爲UserGroup索納塔管理捆綁和學說問題:如何從反面更新實體?

我已經決定在創建/更新界面上,因爲它們可以關聯,所以您可以直接關聯來自組窗體或用戶窗體組的用戶。請注意,關係的擁有方是User

現在到了這個問題。如果我將用戶表單界面中的組關聯起來,那麼所有內容都很好,並且完美地工作(教條尋找到擁有方的變化)。如果我嘗試將組表單界面中的User關聯起來,則無效。

很顯然,我完全知道我有用戶(S)「添加」到組對象,並添加組(this)來,我從形式流傳下來每個用戶(或多個)對象。事實上,這是我的代碼片段Group實體

public function setUsers(\Doctrine\Common\Collections\ArrayCollection $utente) 
{ 
    /* snippet of code for removing old association , didn't reported */ 

    foreach($utente as $u){ 
     $this->users[] = $u; 
     $u->addGroups($this); 
    } 
} 

進入創建表單這個片段做不好自己的工作。進入更新,它不會。
所以我認爲這一定是奏鳴曲的問題,或者是目前我錯過了的東西。

有什麼建議嗎?

UPDATE

經過一段時間花在理解什麼是怎麼回事,我只是發現setUser()不叫成更新操作(讀作提交表單建造到一個存在的實體)。所以,當我創建新的條目(我還沒有一個解決方案)

回答

2

我剛剛發現如何更新實體。
我想這是一個Symfony2相關的行爲,而不是一個奏鳴曲管理員。

簡而言之,您必須告訴Symfony2調用您要更新的對象的setter。

對於使用:

by_reference => false 

在索納塔管理員捆綁情況:

$formMapper 
      ->add('nome') 
      ->add('canali', 'sonata_type_model', array('required' => false)) 
      ->add('utenti', 'sonata_type_model', array('required' => false, 
                 'by_reference' => false)) 
     ; 

在純Symfony2的形式案例:

->add('utenti', 'collection', array(
       'type' => new User(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'prototype' => true, 
       'by_reference' => false, 
      )) 
     ; 
0

不清楚你的意思,對於更新它不會做的工作做好我的代碼只運行。根據您的代碼,我認爲它會在用戶和組之間添加新的關係,但不會刪除舊的。

public function setUsers(\Doctrine\Common\Collections\ArrayCollection $utente) 
{ 
    // to synch internal and external collections, remove relation between users and groups if user is not in the new collection 
    foreach ($this->users as $u) { 
     if (!$utente->contains($u)) { 
      // add this function to user object, it's trivial, just remove give group from internal groups collection 
      $u->removeGroup($this); 
     } 
    } 
    foreach ($utente as $u) { 
     if (!$this->users->contains($u)) { 
      $this->users[] = $u; 
      $u->addGroups($this); 
     } 
    } 
} 
+0

是的,我錯過了控制在哪裏添加新用戶。但是你完全錯過了這個問題:setUsers似乎不適用於更新操作 – DonCallisto

0

嘗試以下添加到您的管理員

public function prePersist($group) 
{ 
    $group->setUsers($group->getUsers()); 
    parent::prePersist($testQuestion); 
} 

public function preUpdate($group) 
{ 
    $group->setUsers($group->getUsers()); 
    parent::preUpdate($testQuestion); 
} 
相關問題