Symfony2 удалить и сохранить много ко многим отношениям


Мне нужна твоя помощь сегодня. Я работаю над небольшим приложением, использующим symphony 2.1, но у меня есть базовая проблема, мне нужны таблицы с отношением "многие ко многим", которое создает третью таблицу:

class Usuario implements UserInterface {
/**
* @ORMManyToMany(targetEntity="AloodBackBundleEntityAlergeno", inversedBy="usuarios")
* @ORMJoinTable(name="UsuariosProductos",
 *      joinColumns={@ORMJoinColumn(name="usuario_user", referencedColumnName="user")},
 *      inverseJoinColumns={@ORMJoinColumn(name="alergeno_id", referencedColumnName="id")}
 *      )
**/
protected $alergenos;
}


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

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

И:

/**
* @ORMManyToMany(targetEntity="AloodBackBundleEntityUsuario", 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();
Не могли бы вы помочь мне понять, что я делаю не так? Большое вам спасибо!
3 3

3 ответа:

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

$collection->removeElement($item);

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

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

Неясно, что представляют собой переменные $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.

Таким образом, ваша проблема может быть решена, делая отношение самостоятельно. ManyToMany на самом деле не существует, потому что, как вы говорите, создается третья таблица. Вы хотите удалить элементы только в этой третьей таблице.

Таким образом, вы должны построить отношение самостоятельно, чтобы удалить непосредственно элемент в третьей таблице.

Итак, сначала создайте третью сущность. Сделайте два отношения ManyToOne от третьей сущности к двум другим сущностям. Тогда вы просто должны просто удалить элемент третьей сущности, которую вы просто созданный.