dea*_*ase 9 doctrine doctrine-orm
如何在不删除任何内容的情况下将关系从多对多表中取消链接?
我试过了:
$getProject = $this->_helper->getDocRepo('Entities\Project')->findOneBy(array('id' => $projectId));
$getCat = $this->_doctrine->getReference('\Entities\Projectcat', $catId);
$getProject->getCategory()->removeElement($getCat);
$this->em->flush();
Run Code Online (Sandbox Code Playgroud)
我的Projectcat实体:
/**
* @ManyToMany(targetEntity="\Entities\Projectcat", cascade={"persist", "remove"})
* @JoinColumn(name="id", referencedColumnName="id")
*/
protected $getCategory;
Run Code Online (Sandbox Code Playgroud)
fyr*_*rye 10
一个相当古老的帖子,但希望提供一种方法来确保从ORM实体方面的学说中删除关联,而不是必须手动执行每个Entity的集合removeElement并扩展@Rene Terstegen的答案.
问题是Doctrine没有"自动神奇地"将关联绑定在一起,但是您可以更新实体的Add/Remove方法来执行此操作.
https://gist.github.com/Ocramius/3121916
以下示例基于OP的项目/类别架构.它假定表project_category
是ManyToMany
关系表,project
而category
表使用主键id
.
class Project
{
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="projects")
* @ORM\JoinTable(
* name="project_category",
* joinColumns={
* @ORM\JoinColumn(name="project", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="category", referencedColumnName="id")
* }
* )
*/
protected $categories;
public function __construct()
{
$this->categories = new ArrayCollection();
}
/**
* @param Category $category
*/
public function removeCategory(Category $category)
{
if (!$this->categories->contains($category)) {
return;
}
$this->categories->removeElement($category);
$category->removeProject($this);
}
}
Run Code Online (Sandbox Code Playgroud)
class Category
{
/**
* @ORM\ManyToMany(targetEntity="Project", mappedBy="categories")
*/
protected $projects;
public function __construct()
{
$this->projects = new ArrayCollection();
}
/**
* @param Project $project
*/
public function removeProject(Project $project)
{
if (!$this->projects->contains($project)) {
return;
}
$this->projects->removeElement($project);
$project->removeCategory($this);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你需要做的就是调用removeCategory
or removeProject
方法,而不是两者.同样可以应用于方法addCategory
和addProject
方法.
$project = $em->find('Entities\Project', $projectId);
$category = $em->getReference('Entities\Category', $categoryId);
$project->removeCategory($category);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
您的信息有限.关于数据库方案和项目的一些额外信息会很好.但要试一试.
你必须从关系的两边删除它.您已从类别中删除它,但您也应将其从项目中删除.
// Remove Category from Project
$Project->Category->removeElement($Category);
// Remove Project from Category
$Category->Project->removeElement($Project);
Run Code Online (Sandbox Code Playgroud)
祝好运!
归档时间: |
|
查看次数: |
13825 次 |
最近记录: |