2011-09-04 22 views
6

何も削除せずに多対多のテーブルからリレーションのリンクを解除するにはどうすればよいですか?私が試してみましたdoctrine 2、多対多の関連付けを削除するにはどうすればよいですか?

$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; 
+0

誰でも知っていますか?私はすべてをteeied ..私はプロジェクトを削除することができますまた、それは多くのテーブルから削除されますが、今回は、私はそれらをリンク解除したい。私はそれらが存在する必要がありますが、カテゴリに関連付けられていません。 –

答えて

8

あなたの情報が少し限られています。データベーススキームとプロジェクトに関するいくつかの追加情報は素晴らしいでしょう。しかし、それを試してみてください。

リレーションシップの両側から削除する必要があります。カテゴリから削除しましたが、プロジェクトからも削除する必要があります。

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

幸運を祈る!

0

古い投稿ですが、上記の回答が私を助けてくれましたが、それを少し拡張するのに役立つかもしれません。多くのカテゴリ(および多くのプロジェクトを持つことができるカテゴリ)を持つプロジェクトがあります。それらのすべて:

$project->getCategories(); 

私はプロジェクトのためのすべてのカテゴリを削除したい場合は、私は単純に次の操作を行います。

foreach ($project->getCategories() as $category) { 
    $project->getCategories()->removeElement($category); 
} 

元の質問の問題は、私はDoctrineはあなたがしたいと考えているということでしたプロジェクトが参照するカテゴリを渡すだけでなく、あなたがこのコードを使用して独自につかんだカテゴリ:

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

うまくいけばいいと思います。私は少し専門用語を台無しにしていることを知っています。

+0

エンティティクラスは、関連するエンティティまたは参照が使用されたかどうかを気にするべきではありません。 http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxiesプロキシリファレンスオブジェクトは透過的でなければなりません。 – fyrye

6

かなり古い投稿でしたが、各エンティティのコレクションremoveElementを手動で実行して@Rene Terstegenによる回答を拡張するのではなく、ORCLのORM Entity側から関連付けが解除されるようにする方法を提供したかったのです。

Doctrineが関連を「自動マジック」で結びつけていないという問題がありますが、そのためにエンティティの追加/削除メソッドを更新できます。

https://gist.github.com/Ocramius/3121916

ザ・例以下は、OPのプロジェクト/カテゴリスキーマに基づいています。 テーブルは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); 
    } 
} 

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); 
    } 
} 

その後、すべてを行う必要がある代わりに、両方の、removeCategoryまたはremoveProjectメソッドを呼び出すことです。同じことをaddCategoryaddProjectの方法にも適用できます。

$project = $em->find('Entities\Project', $projectId); 
$category = $em->getReference('Entities\Category', $categoryId); 
$project->removeCategory($category); 
$em->flush(); 
関連する問題