2011-06-23 7 views
8

के साथ सिद्धांत 2 में काम नहीं करता है, मैं सिद्धांत 2 के साथ कुछ सरल सीआरयूडी प्राप्त करने की कोशिश कर रहा हूं, लेकिन जब एक सरणी संग्रह के रूप में एक प्रॉपर्टी सेट के साथ रिकॉर्ड अपडेट करने का समय हो मुझे लगता है कि इसे हटाने के लिए हटाने() को काम नहीं करना प्रतीत होता है। मैं भी इस हास्यास्पद बदसूरत तरह से यह कर की कोशिश की:removeElement() और clear() सरणी संग्रह संपत्ति

foreach($entity->getCountries() as $c) { 
     $entity->getCountries()->removeElement($c); 
     $this->em->persist($entity); 
     $this->em->flush(); 
} 

और यह काम नहीं किया ... किसी को भी जानता है कि यह कैसे संभाल करने के लिए? मैंने कई अलग-अलग रूपों में इसका समाधान करने के लिए कहा है और अब तक कोई अच्छी प्रतिक्रिया नहीं मिली है ... ऐसा लगता है कि सिद्धांत 2 सीआरयूडी हैंडलिंग के अच्छे उदाहरणों की कमी है। मैं अनुरोध पर अधिक कोड पोस्ट करूंगा।

संपादित

//in user entity 
/** 
* 
* @param \Doctring\Common\Collections\Collection $property 
* @OneToMany(targetEntity="Countries",mappedBy="user", cascade={"persist", "remove"}) 
*/ 
private $countries; 

//in countries entity 
/** 
* 
* @var User 
* @ManyToOne(targetEntity="User", inversedBy="id") 
* @JoinColumns({ 
* @JoinColumn(name="user_id", referencedColumnName="id") 
* }) 
*/ 
private $user; 
+0

वास्तव में क्या तुम हो आप हासिल करने की कोशिश कर रहे हैं? क्या आप सभी देशों को हटाने की कोशिश कर रहे हैं? या आप एक देश को हटाने की कोशिश कर रहे हैं? क्या आपने डॉक्स में एसोसिएशन के साथ वर्किंग पर अनुभाग पढ़ा है: http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-associations.html#removing-associations – rojoca

+0

yes @rojoca मैंने इसे सब पढ़ लिया है। और मैं एक उपयोगकर्ता इकाई से जुड़े सभी देशों को हटाने की कोशिश कर रहा हूं, ताकि मैं उन्हें और अधिक अलग-अलग देशों के लिए बदल सकूं। –

उत्तर

12

मैं ऐसी घटनाओं के साथ एक परियोजना में ऐसा कुछ करता हूं जिसमें प्रतिभागियों को आपके उपयोगकर्ता/देश संबंधों के विपरीत नहीं है। मैं बस प्रक्रिया को प्रस्तुत करूंगा और आप देख सकते हैं कि आप कुछ भी कर रहे हैं या नहीं।

Participant इकाई

/** 
* @ManyToOne(targetEntity="Event", inversedBy="participants", fetch="LAZY") 
* @JoinColumn(name="event_id", referencedColumnName="id", nullable="TRUE") 
* @var Event 
*/ 
protected $event; 

Event इकाई पर:

/** 
* @OneToMany(targetEntity="Participant", mappedBy="event") 
* @var \Doctrine\Common\Collections\ArrayCollection 
*/ 
protected $participants; 
इसके अलावा Event#__constructor में

मैं इस तरह प्रारंभ:

$this->participants = new \Doctrine\Common\Collections\ArrayCollection(); 

यहाँ कैसे मैं एक घटना को अद्यतन है:

public function update(Event $event, Event $changes) 
{ 
    // Remove participants 
    $removed = array(); 
    foreach($event->participants as $participant) 
    { 
     if(!$changes->isAttending($participant->person)) 
     { 
      $removed[] = $participant; 
     } 
    } 

    foreach($removed as $participant) 
    { 
     $event->removeParticipant($participant); 
     $this->em->remove($participant); 
    } 

    // Add new participants 
    foreach($changes->participants as $participant) 
    { 
     if(!$event->isAttending($participant->person)) 
     { 
      $event->addParticipant($participant); 
      $this->em->perist($participant); 
     } 
    } 

    $event->copyFrom($changes); 
    $event->setUpdated(); 
    $this->em->flush(); 
} 

Event इकाई पर तरीके हैं:

public function removeParticipant(Participant $participant) 
{ 
    $this->participants->removeElement($participant); 
    $participant->unsetEvent(); 
} 

public function addParticipant(Participant $participant) 
{ 
    $participant->setEvent($this); 
    $this->participants[] = $participant; 
} 

Participant इकाई पर तरीके हैं:

public function setEvent(Event $event) 
{ 
    $this->event = $event; 
} 

public function unsetEvent() 
{ 
    $this->event = null; 
} 

अद्यतन: isAttending विधि

/** 
* Checks if the given person is a 
* participant of the event 
* 
* @param Person $person 
* @return boolean 
*/ 
public function isAttending(Person $person) 
{ 
    foreach($this->participants as $participant) 
    { 
     if($participant->person->id == $person->id) 
      return true; 
    } 

    return false; 
} 
+0

मैं इसे अपने प्रोजेक्ट में अनुकूलित कर रहा हूं। एक त्वरित सवाल हालांकि ... मैं अपने अपडेट फ़ंक्शन को एक सरणी ($ _POST वास्तव में) पास कर रहा हूं, आप ईवेंट कैसे सेट करते हैं और कहां से आप इसे ऑब्जेक्ट के रूप में पास करते हैं? मुझे लगता है कि सिद्धांत के लिए यह "स्वस्थ" है, है ना? ऑब्जेक्ट को ऑब्जेक्ट को "स्वचालित रूप से" फ़ीड करने का कोई तरीका है? –

+0

मैं $ _POST से "automagical" ऑब्जेक्ट निर्माण से बचूंगा। इस तरह से ऐसा करने का कारण यह है कि ईवेंट इनपुट जटिल है और बहुत सत्यापन की आवश्यकता है। मेरे पास एक वर्ग (फैक्ट्री) है जो एक सरणी लेता है (उदा।, '$ _POST') और एक 'ईवेंट' ऑब्जेक्ट बनाता है। एक बार जब मैंने उस ऑब्जेक्ट को सत्यापित कर लिया है तो मैं इसे "नया" कर सकता हूं, या उपर्युक्त मौजूदा ईवेंट को अपडेट करने के लिए इसका उपयोग कर सकता हूं। यदि आपका इनपुट सरल है और केवल सरल सत्यापन की आवश्यकता है तो आपको इस चरम पर जाने की आवश्यकता नहीं है। बस सुनिश्चित करें कि आप हमेशा इनपुट मान्य करते हैं। – rojoca

+0

आपकी सहायता और उदाहरण के साथ मैं सिद्धांत 2 के साथ अपनी सबसे बड़ी समस्या को दूर करने में सक्षम था, मैं वास्तव में इसके साथ फंस गया था और अब मेरा कोड भी सुंदर दिखता है। आपका बहुत बहुत धन्यवाद! –

1

न्यू जवाब

अपने देशों इकाई में, आप नहीं करना चाहिए था:

@ManyToOne(targetEntity="User", inversedBy="countries") 
inversedBy = "आईडी" के बजाय

?

प्रारंभिक जवाब

आप निकालना झरना के रूप में अपने इकाई के देशों क्षेत्र सेट करना होगा। उदाहरण के लिए, कई रिश्ते के लिए एक द्विदिश एक पर:

class Entity 
{ 
    /** 
    * 
    * @OneToMany(targetEntity="Country", mappedBy="entity", cascade={"remove"}) 
    */ 
    private $countries; 
} 

इस तरह, जब आपके इकाई की बचत, सिद्धांत (जैसे देशों के रूप में) अपने इकाई से जुड़ी संग्रह में परिवर्तन की बचत होगी। अन्यथा आपको उन देशों को स्पष्ट रूप से हटाना होगा जिन्हें आप फ्लश करने से पहले हटाना चाहते हैं, उदा।

$this->em()->remove($aCountry); 

यह लगातार, विलय और अलग-अलग संचालन के लिए भी मान्य है। अधिक जानकारी here

+0

@ फ़ेकन संपादन को चेक करें, जैसा कि आपने सुझाव दिया है, यह पहले ही सेट है, हालांकि यह काम नहीं करता है। –

+0

हाय @ la_f0ka, मेरा संपादन देखें। – faken

+0

@faken अच्छी तरह से मैंने कोशिश की और मुझे अभी भी इन लानत देशों को हटाया नहीं जा रहा है –

संबंधित मुद्दे