Doctrine 条令2,如何消除多对多关联?

Doctrine 条令2,如何消除多对多关联?,doctrine,doctrine-orm,Doctrine,Doctrine Orm,如何在不删除任何内容的情况下从多对多表中取消关联 我试过: $getProject = $this->_helper->getDocRepo('Entities\Project')->findOneBy(array('id' => $projectId)); $getCat = $this->_doctrine->getReference('\Entities\Projectcat', $catId); $getProject->getCategory

如何在不删除任何内容的情况下从多对多表中取消关联

我试过:

$getProject = $this->_helper->getDocRepo('Entities\Project')->findOneBy(array('id' => $projectId));
$getCat = $this->_doctrine->getReference('\Entities\Projectcat', $catId);

$getProject->getCategory()->removeElement($getCat);
$this->em->flush();
我的Projectcat实体:

/**
 * @ManyToMany(targetEntity="\Entities\Projectcat", cascade={"persist", "remove"})
 * @JoinColumn(name="id", referencedColumnName="id")
 */
protected $getCategory;

你的信息有点有限。关于数据库方案和项目的一些额外信息会很好。但是试一下

你必须将它从关系的双方中移除。您已将其从类别中删除,但也应将其从项目中删除

// Remove Category from Project
$Project->Category->removeElement($Category);
// Remove Project from Category
$Category->Project->removeElement($Project);

祝你好运

一篇旧文章,但上面的答案对我有帮助,但它可能有助于扩展它一点,我有一个可以有许多类别的项目(以及可以有许多项目的类别),所以这段代码让我了解了所有这些:

$project->getCategories();
如果我想删除项目的所有类别,我只需执行以下操作:

 foreach ($project->getCategories() as $category) {
    $project->getCategories()->removeElement($category);
 }
原始问题的问题是,我相信条令希望您通过项目引用的类别,而不仅仅是您使用此代码独立获取的类别的引用:

$getCat = $this->_doctrine->getReference('\Entities\Projectcat', $catId);

希望这是有道理的。我知道我有点弄乱了术语。

一篇相当老的帖子,但想提供一种方法来确保将关联从ORM实体方面的条令中删除,而不必手动执行每个实体的集合移除元素,并通过@Rene Terstegen扩展答案

问题在于,条令不会“自动神奇地”将关联联系在一起,但是您可以更新实体的添加/删除方法来实现这一点

下面的示例基于OP的项目/类别模式。 它假定表
project\u category
manytomy
关系表,
project
category
表使用主键
id

类项目
{
/**
*@ORM\ManyToMany(targetEntity=“Category”,inversedBy=“projects”)
*@ORM\JoinTable(
*name=“项目\类别”,
*连接柱={
*@ORM\JoinColumn(name=“project”,referencedColumnName=“id”)
*  },
*反向连接柱={
*@ORM\JoinColumn(name=“category”,referencedColumnName=“id”)
*  }
* )
*/
受保护的类别;
公共函数构造()
{
$this->categories=newarraycollection();
}
/**
*@param Category$Category
*/
公共功能移除类别(类别$Category)
{
如果(!$this->categories->contains($category)){
返回;
}    
$this->categories->removelement($category);
$category->removeProject($this);
}
}

类别
{    
/**
*@ORM\ManyToMany(targetEntity=“Project”,mappedBy=“categories”)
*/
受保护的项目;
公共函数构造()
{
$this->projects=newarraycollection();
}
/**
*@param Project$Project
*/
公共功能移除项目(项目$Project)
{
如果(!$this->projects->contains($project)){
返回;
}    
$this->projects->removelement($project);
$project->removeCategory($this);
}
}

然后,您需要做的就是调用
removeCategory
removeProject
方法,而不是同时调用这两种方法。这同样适用于
addCategory
addProject
方法

$project=$em->find('Entities\project',$projectd);
$category=$em->getReference('Entities\category',$categoryId);
$project->removeCategory($category);
$em->flush();

有人知道吗?我什么都说了。。我可以删除项目,它也会从多对多表中删除,但这次,我只想取消它们之间的链接。我需要它们存在,但不与类别关联。entity类不应该关心是否使用了关联的实体或引用。代理引用对象应该是透明的。