学说2,如何删除多对多关联?

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_categoryManyToMany关系表,projectcategory表使用主键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)

然后你需要做的就是调用removeCategoryor removeProject方法,而不是两者.同样可以应用于方法addCategoryaddProject方法.

$project = $em->find('Entities\Project', $projectId);
$category = $em->getReference('Entities\Category', $categoryId);
$project->removeCategory($category);
$em->flush();
Run Code Online (Sandbox Code Playgroud)


Ren*_*gen 9

您的信息有限.关于数据库方案和项目的一些额外信息会很好.但要试一试.

你必须从关系的两边删除它.您已从类别中删除它,但您也应将其从项目中删除.

// Remove Category from Project
$Project->Category->removeElement($Category);
// Remove Project from Category
$Category->Project->removeElement($Project);
Run Code Online (Sandbox Code Playgroud)

祝好运!