Symfony2 删除并保存多对多关系

Posted

技术标签:

【中文标题】Symfony2 删除并保存多对多关系【英文标题】:Symfony2 remove and save many to many relations 【发布时间】:2013-08-30 09:02:12 【问题描述】:

我今天需要你的帮助。我正在使用 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; 

和:

/**
* @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();

你能帮我弄清楚我做错了什么吗?非常感谢!

【问题讨论】:

您的代码到底有什么问题? ...尽管您坚持对象已经由在这种情况下没有必要的学说管理? :) 假设我有用户 1 和过敏原 1,然后我说用户 1 对 1 过敏,我可以这样做,但是当我想删除该连接时(用户 1 不再过敏过敏原 1) 我不能删除那个关系。 【参考方案1】:

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

$collection->removeElement($item);

remove($key) 函数将按键删除,而removeElement($item) 则从集合中删除该项目(如果找到)。看看ArrayCollection code here。

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

【讨论】:

所以,我尝试更改 $em->persist($alergenosUser);对于 $em->remove($alergenosUser);但它甚至删除了用户的所有内容,我只想从第三个表中删除数据。你能帮帮我吗? 所以你只想删除两个实体之间的关系? (这将导致删除可连接的表格行) 没错!这就是我想要的:) 它起作用了,我之前尝试过它并没有起作用,因为我的实体中有一个 orphanRemoval=true。谢谢!【参考方案2】:

不清楚$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 附带的版本。

【讨论】:

【参考方案3】:

所以你的问题可以自己解决。 ManyToMany 并不真正存在,因为正如您所说,创建了第三个表。您只想删除第三个表中的元素。

所以你必须自己建立关系才能直接删除第三个表中的元素。

所以首先创建第三个实体。 从第三个实体到另外两个实体做两个关系 ManyToOne。 然后,您只需删除刚刚创建的第三个实体的一个元素。

【讨论】:

我认为这不是实现这一目标的正确方法,我使用 $collection->removeElement($item);像@nifr 我只需要删除我的学说实体的 orphanRemoval=true 。不过还是谢谢!

以上是关于Symfony2 删除并保存多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

保存循环删除多对多CoreData关系的一端

多对多和形式 Symfony2

多对多的 Symfony2 DQL 更新查询

symfony2 多对多奏鸣曲 admin model_list

一对多还是多对多?

hibernate多对多双向关系映射的级联配置