我今天需要你的帮助。我正在使用symphony 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();
你可以帮我弄清楚我做错了什么吗?非常感谢你!
答案 0 :(得分:4)
要从集合中删除项目,请使用以下命令:
$collection->removeElement($item);
remove($key)
函数将按键删除,而removeElement($item)
删除项目中的项目(如果找到)。看看ArrayCollection code here。
请注意,学说只会检查关系的拥有方面是否有变化。
答案 1 :(得分: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附带的版本提供。
答案 2 :(得分:0)
所以你自己的问题可以解决问题。 ManyToMany并不存在,因为正如你所说的那样创建了第三个表。您只想在第三个表中删除元素。
因此,您必须自己构建关系以直接删除第三个表中的元素。
首先创建第三个实体。 做两个关系ManyToOne从第三个实体到另外两个实体。 然后你只需要删除刚刚创建的第三个实体的元素。