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类不应该关心是否使用了关联的实体或引用。代理引用对象应该是透明的。