2013-08-30 4 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) I не может удалить это отношение. – soni

ответ

4

Для того, чтобы удалить элемент из коллекции используйте следующее:

$collection->removeElement($item); 

remove($key) функция удалит с помощью ключа, а removeElement($item) удаляет элемент из коллекции, если найден. Посмотрите на ArrayCollection code here.

Помните, что доктрина будет проверять только принадлежащую стороне отношения для изменений.

+0

Итак, я попытался сменить $ em-> persist ($ alergenosUser); для $ em-> remove ($ alergenosUser); но он удаляет все, даже пользователь, я просто хочу удалить данные из третьей таблицы. Не могли бы вы мне помочь, пожалуйста? – soni

+0

, так что вы просто хотите удалить связь между двумя объектами?(что приведет к удалению строки таблицы в соединении) – nifr

+0

Точно! Вот что я хочу :) – soni

0

Не ясно, что представляют $alergenosUsuarioIds и $alergen переменные, но вы можете быть ошибочно об использовании этого метода remove()ArrayCollection. Вам нужно указать индекс, а не идентификатор объекта, который вы хотите удалить. Вы также можете использовать метод 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 для моего объекта doctrine. Но все равно спасибо! – soni