2011-09-04 6 views
6

कुछ भी हटाने के बिना आप कई से कई टेबल से संबंध कैसे अनलिंक करते हैं?सिद्धांत 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

किसी को भी पता है? मैंने सब कुछ चिढ़ाया ..मैं प्रोजेक्ट को हटा सकता हूं और यह कई से कई टेबलों को भी हटा देगा लेकिन इस बार, मैं बस उन्हें अनलिंक करना चाहता हूं। मुझे उन्हें अस्तित्व में रहने की आवश्यकता है लेकिन एक श्रेणी से जुड़ा नहीं है .. –

उत्तर

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

मूल प्रश्न के साथ इस मुद्दे था मुझे विश्वास है कि सिद्धांत को आप चाहता है प्रोजेक्ट द्वारा संदर्भित श्रेणी में पास करें, न केवल संदर्भ श्रेणी जो आपने इस कोड का उपयोग करके स्वतंत्र रूप से पकड़ लिया है:

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

उम्मीद है कि यह समझ में आता है। मुझे पता है कि मैं शब्दावली को थोड़ा गड़बड़ कर रहा हूं।

+0

इकाई वर्ग को ध्यान नहीं दिया जाना चाहिए यदि संबंधित इकाई या संदर्भ का उपयोग किया गया हो। http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies प्रॉक्सी संदर्भ ऑब्जेक्ट पारदर्शी होना चाहिए। – fyrye

6

एक पुरानी पोस्ट लेकिन यह सुनिश्चित करने के लिए एक तरीका प्रदान करना चाहता था कि एसोसिएशन को प्रत्येक इकाई के संग्रह हटाने के मैन्युअल रूप से निष्पादित करने और @Rene Terstegen द्वारा उत्तर पर विस्तार करने के बजाय, सिद्धांत के ओआरएम इकाई पक्ष से हटा दिया गया था।

मुद्दा यह है कि सिद्धांत "ऑटो-जादुई" संगठनों को एक साथ जोड़ता नहीं है, फिर भी आप ऐसा करने के लिए इकाई के जोड़ें/निकालें विधियों को अपडेट कर सकते हैं।

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

उदाहरण नीचे ओपी की परियोजना/श्रेणी स्कीमा पर आधारित है। यह मानता है कि तालिका 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 विधि कॉल करने के बजाय दोनों की है। इसे addCategory और addProject विधियों के लिए भी लागू किया जा सकता है।

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