2013-08-30 64 views
3

我今天需要你的幫助。我在一個小應用程序的工作使用交響樂2.1,但我有一個問題的基礎,我有表有一個多對多的關係,它創建了一個第三個表:Symfony2刪除並保存多對多關係

class Usuario implements UserInterface { 
/** 
* @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Alergeno", inversedBy="usuarios") 
* @ORM\JoinTable(name="UsuariosProductos", 
*  joinColumns={@ORM\JoinColumn(name="usuario_user", referencedColumnName="user")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="alergeno_id", referencedColumnName="id")} 
*  ) 
**/ 
protected $alergenos; 
} 


public function __construct(){ 
    $this->alergenos = new ArrayCollection(); 
} 

public function getAlergenos() { return $this->alergenos; } 

和:

/** 
* @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Usuario", mappedBy="alergenos") 
**/ 
protected $usuarios; 

然後我需要刪除未選擇的Alergenos,這是我的控制器:

$alergenosUser = $em->getRepository("BackBundle:Usuario")->find($usuario); 

$resultSym = array_diff($alergenosUsuarioIds, $alergen); 

foreach($resultSym as $result) { 
    $alergenosUser->getAlergenos()->remove($result); 
} 
$em->persist($alergenosUser); 
$em->flush(); 

你能幫我弄清楚我做錯了什麼嗎?非常感謝!

+0

你的代碼到底是什麼問題? ......儘管你堅持對象已經由這種情況下沒有必要的教義管理? :) – nifr

+0

可以說我有用戶1和過敏原1,然後我說用戶1對1過敏,我可以做到這一點,但是當我想刪除該連接時(用戶1不再對過敏原1過敏),我無法刪除該關係。 – soni

回答

4

爲了從集合中刪除一個項目使用:而如果發現removeElement($item)從集合中刪除的項目

$collection->removeElement($item); 

remove($key)功能將被取消導航鍵。看看ArrayCollection code here

請注意,該原則只會檢查關係的擁有方是否有變更。

+0

所以,我試着改變$ em-> persist($ alergenosUser); for $ em-> remove($ alergenosUser);但它甚至刪除了用戶的一切,我只想從第三個表中刪除數據。請問你能幫幫我嗎? – soni

+0

所以你只是想刪除兩個實體之間的關係?(這會導致刪除連接表中的表格行) – nifr

+0

正是!這就是我想要的:) – soni

0

不清楚$alergenosUsuarioIds$alergen變量代表什麼,但是您可能會錯誤地使用ArrayCollectionremove()方法。 您需要給它一個索引,而不是要刪除的實體的ID。您也可以使用removeElement()方法並將其傳遞給實體。

舉例來說,你可以做這樣的事情:

$elements = $alergenosUser->getAlergenos(); 
foreach ($elements as $element) { 
    if ($element->getId() == $id_from_array_diff_or_whatever) { 
     $elements->removeElement($element); 
    } 
} 

$elements = $alergenosUser->getAlergenos(); 
foreach ($elements as $key => $element) { 
    if ($element->getId() == $id_from_array_diff_or_whatever) { 
     $elements->remove($key); 
     // or 
     unset($elements[$key]); 
    } 
} 

您還可以使用matching(),但我不知道它是可用附帶的Symfony2 2.1版本。

0

所以你的問題可以通過你自己的關係來解決。 ManyToMany並不存在,因爲正如你所說的創建第三個表。您只想刪除此第三個表格中的元素。

因此,您必須親自構建關係以直接刪除第三個表中的元素。

所以先創建第三個實體。 做從第三個實體到另外兩個實體的兩個關係ManyToOne。 然後,您只需簡單地刪除剛剛創建的第三個實體的元素。

+0

我認爲這不是一個正確的方式來實現這一目標,我使用$ collection-> removeElement($ item);像@ nifr我只需要刪除我的教義實體的orphanRemoval = true。不過謝謝! – soni