Symfony2删除并保存多对多关系

Symfony2删除并保存多对多关系,symfony,many-to-many,symfony-2.1,persist,Symfony,Many To Many,Symfony 2.1,Persist,我今天需要你的帮助。我正在使用Symfony 2.1开发一个小应用程序,但我有一个基本问题,我必须使用多对多关系创建第三个表: class Usuario implements UserInterface { /** * @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Alergeno", inversedBy="usuarios") * @ORM\JoinTable(name="UsuariosProductos", *

我今天需要你的帮助。我正在使用Symfony 2.1开发一个小应用程序,但我有一个基本问题,我必须使用多对多关系创建第三个表:

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; }
以及:

然后我需要移除未选择的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();

你能帮我找出我做错了什么吗?非常感谢你

要从集合中删除项目,请使用以下命令:

$collection->removeElement($item);
remove($key)
函数将按键删除,而
removeElement($item)
将从集合中删除找到的项目。看一看这张照片


请注意,原则只会检查关系的拥有方是否有更改。

不清楚
$alergenosUsuarioIds
$alergen
变量代表什么,但您可能会误解
数组集合的
remove()
方法的用法。 您需要给它一个索引,而不是要删除的实体的id。您还可以使用
removelement()
方法将实体传递给它

例如,您可以这样做:

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


您也可以使用
matching()
,但我不确定它是否与symfony2.1附带的版本一起提供。

因此您的问题可以通过自己处理关系来解决。 ManyToMany实际上并不存在,因为正如您所说,创建了第三个表。您只想删除第三个表中的元素

因此,您必须自己构建关系,以便直接删除第三个表中的元素

所以首先创建第三个实体。 从第三个实体到其他两个实体之间建立两个关系。
然后,您只需删除刚刚创建的第三个实体的一个元素。

您的代码到底有什么问题。。。尽管您坚持对象已由条令管理,但在本例中不需要条令管理?:)假设我有用户1和过敏原1,然后我说用户1对1过敏,我可以这样做,但是当我想删除那个连接(用户1不再对过敏原1过敏)时,我不能删除那个关系;对于$em->remove($alergenosUser);但它会删除所有内容,甚至是用户,我只想从第三个表中删除数据。你能帮我吗?那么你只想删除两个实体之间的关系?(这将导致删除jointable中的表行)完全正确!这就是我想要的:)它起作用了,我以前试过,但没有起作用,因为我的实体中有一个孤儿移除=真。谢谢我认为这不是实现这一点的正确方法,我使用$collection->removeElement($item)实现了这一点;就像@nifr一样,我只需要删除我的条令实体。不过还是要谢谢你!
$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]);
    }
}