2011-10-10 12 views
36

के लिए डॉक्टर कैस्केड विकल्प मुझे कैस्केड ऑपरेशंस के सिद्धांत मैनुअल के explanation की समझ में कठिनाई हो रही है और किसी को सरल सरलता के संबंध में विकल्पों को समझने में मेरी सहायता करने के लिए किसी की आवश्यकता है।OneToMany

मेरे आवेदन में, मेरे पास एक सारणी/इकाई है जिसका नाम आलेख है जिसमें 'आईडी' फ़ील्ड को विषय-वस्तु नामक तालिका/इकाई में संदर्भित करने वाला एक विदेशी कुंजी फ़ील्ड है।

जब मैं एक नया आलेख बनाता हूं, तो मैं ड्रॉपडाउन मेनू से विषय का चयन करता हूं। यह अनुच्छेद तालिका में 'topic_id' विदेशी कुंजी फ़ील्ड में एक पूर्णांक डालता है।

/** 
* @ManyToOne(targetEntity="Topic") 
* @JoinColumn(name="topic_id", referencedColumnName="id", nullable=false) 
*/ 
private $topic; 

विषय इकाई अनुच्छेद इकाई के बारे में कोई प्रत्यागामी एनोटेशन नहीं है:

मैं $ विषय संघ इस तरह अनुच्छेद इकाई में स्थापित किया है। विषयों पर ध्यान नहीं दिया जाता है कि लेख उन्हें किस संदर्भ में संदर्भित करते हैं और विषय को संदर्भित करने वाले आलेख को हटाए जाने वाले आलेख को विषय के साथ कुछ भी करने की आवश्यकता नहीं है।

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

तो मुझे पता है कि मुझे अनुच्छेद इकाई में शामिल करने के लिए एक कैस्केड ऑपरेशन चुनने की आवश्यकता है, लेकिन मुझे कैसे पता चलेगा कि इस स्थिति में कौन सा ऑपरेशन चुनना है?

सिद्धांत मैनुअल पढ़ने से, "अलग करें" सही विकल्प की तरह लगता है। लेकिन दूसरों के समान प्रश्नों का शोध here और here मुझे लगता है कि मैं इसके बजाय "persist" का उपयोग करना चाहता हूं।

क्या कोई मुझे यह समझने में मदद कर सकता है कि "जारी रखें," "निकालें," "विलय करें," और "अलग करें" का मतलब एक साधारण मल्टी टोन रिश्ते के संदर्भ में है जैसा मैंने वर्णन किया है?

+6

+1। उम्मीद है कि कोई जल्द ही इसका उत्तर देगा, मैं कैस्केड विकल्प पर और जानना चाहता हूं। इस समय डॉक्टर 2 के बारे में किताबों या दस्तावेज की कमी है। – gremo

उत्तर

27

सिद्धांत 2 दस्तावेज़ में "9.6. Transitive persistence/Cascade Operations" कुछ उदाहरण हैं कि आपको अपनी संस्थाओं को कैसे कॉन्फ़िगर करना चाहिए ताकि जब आप $ लेख जारी रखें, तो $ विषय भी जारी रहेगा। आपके मामले में मैं विषय संस्था के लिए यह व्याख्या सुझाव देंगे:

/** 
* @OneToMany(targetEntity="Article", mappedBy="topic", cascade={"persist", "remove"}) 
*/ 
private $articles; 

इस समाधान का दोष यह है कि आप विषय संस्था के लिए $ लेख संग्रह में शामिल करने के लिए है कि है, लेकिन आप इसके बिना गेटर/सेटर निजी छोड़ सकते हैं।

और जैसा @ कर्ट-krueckeberg उल्लेख किया है, आप वास्तविक विषय इकाई जब नए लेख बनाने, यानी .:

$topic = $em->getRepository('Entity\Topic')->find($id); 
$article = new Article($topic); 
$em->persist($article); 
$em->flush(); 

// perhaps, in this case you don't even need to configure cascade operations 

गुड लक से गुजरना होगा! अच्छे प्रश्न के लिए

+0

लिंक मर चुका है। क्या आप एक नया खोज सकते हैं? – ferdynator

+0

@ferdynator मैंने लिंक अपडेट किया है, नोटिस के लिए धन्यवाद। – Serg

0

यदि आपके पास @OneToMany यूनिडायरेक्शनल एसोसिएशन है, जैसा कि सिद्धांत संदर्भ के अनुभाग 6.10 में वर्णित है, तो संभव है कि आप फ्लश को कॉल करने से पहले विषय को जारी रखें। अनुच्छेद में topic_id प्राथमिक कुंजी सेट न करें। इसके बजाय विषय उदाहरण सेट करें।

उदाहरण के लिए, इस तरह के दिए गए अनुच्छेद और विषय संस्थाओं:

<?php 
namespace Entities; 

/** 
@Entity 
@Table(name="articles") 
*/ 
class Article { 

/** 
* @Id 
* @Column(type="integer", name="article_id") 
* @GeneratedValue 
*/ 
    protected $id; 

/** 
* @Column(type="text") 
*/ 
protected $text; 

/** 
* @ManyToOne(targetEntity="Topic", inversedBy="articles") 
* @JoinColumn(name="topic_id", referencedColumnName="topic_id") 
*/ 
protected $topic; 

public function __construct($text=null) 
{ 
    if (!is_null($text)) { 
     $this->text = $text; 
    } 
} 
public function setArticle($text) 
{ 
    $this->text = $text; 
} 

public function setTopic(Topic $t) 
{ 
    $this->topic = $t; 
} 
} 

<?php 
namespace Entities; 
/** 
    @Entity 
    @Table(name="topics") 
*/ 
class Topic { 

/** 
* @Id 
* @Column(type="integer", name="topic_id") 
* @GeneratedValue 
*/ 
    protected $id; 

    public function __construct() {} 

    public function getId() {return $this->id;} 
} 

के बाद आप स्कीमा उत्पन्न:

# doctrine orm:schema-tool:create 

इन संस्थाओं जारी रहती है के लिए कुछ ऐसा दिखाई देगा अपने कोड इस

//configuration omitted.. 
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config); 

$topic = new Entities\Topic(); 
$article1 = new Entities\Article("article 1"); 
$article2 = new Entities\Article("article 2"); 
$article1->setTopic($topic); 
$article2->setTopic($topic); 
$em->persist($article1); 
$em->persist($article2); 
$em->persist($topic); 

try { 
    $em->flush(); 
} catch(Exception $e) { 
    $msg= $e->getMessage(); 
    echo $msg . "<br />\n"; 
} 
return; 

मुझे आशा है कि इससे मदद मिलती है।

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