Symfony2 删除并保存多对多关系

问题描述 投票:0回答:3

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

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

php symfony many-to-many symfony-2.1 persist
3个回答
5
投票

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

$collection->removeElement($item);

remove($key)
功能将通过按键删除,而
removeElement($item)
则从集合中删除找到的项目。在这里查看 ArrayCollection 代码

请注意,该原则只会检查关系的拥有方是否发生变化。


0
投票

目前尚不清楚

$alergenosUsuarioIds
$alergen
变量代表什么,但您可能会误解
remove()
ArrayCollection
方法的用法。 您需要给它一个索引,而不是要删除的实体的 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 关系。 然后您只需删除刚刚创建的第三个实体的一个元素即可。

© www.soinside.com 2019 - 2024. All rights reserved.