2013-09-28 7 views
8

मुझे डॉक्टरेट में यूनिडायरेक्शनल मल्टी टॉनी रिश्ते के साथ समस्या है। मामला बहुत आसान है: उत्पाद में कई टैग हैं। टैग को उत्पाद से जोड़ा जा सकता है लेकिन मेरे मॉडल में किसी भी "टैग करने योग्य" इकाई को भी जोड़ा जा सकता है। यहां मेरे कोड का स्निपेट है:सिद्धांत ManyToMany: किसी ऑब्जेक्ट को हटाने

/** 
* @Entity 
* @Table(name="products") 
**/ 
class Product { 

    /** some other fields here */ 

    /** 
    * @ManyToMany(targetEntity="Tag") 
    * @JoinTable(name="products_tags", 
    *  joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="tag_id", referencedColumnName="id")}  
    *  ) 
    */ 
    protected $tags; 

} 

चूंकि टैग क्लास के अपने यूनिडायरेक्शनल रिलेशन कोड को छोड़ दिया गया है।

CREATE TABLE `products_tags` (
    `product_id` int(11) NOT NULL, 
    `tag_id` int(11) NOT NULL, 
    PRIMARY KEY (`product_id`,`tag_id`), 
    KEY `IDX_E3AB5A2C4584665A` (`product_id`), 
    KEY `IDX_E3AB5A2CBAD26311` (`tag_id`), 
    CONSTRAINT `FK_E3AB5A2CBAD26311` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`), 
    CONSTRAINT `FK_E3AB5A2C4584665A` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

मैं उत्पाद कुछ इसे से जुड़े टैग नहीं है कि दूर करने के लिए करना चाहते हैं:

इस तरह परिभाषित संघ के लिए सिद्धांत निम्नलिखित एसक्यूएल कोड (एसक्यूएल उत्पादों की मेज और टैग तालिका के लिए छोड़ दिया जाता है) उत्पन्न।

/* $product is already persisted, $em is an Entity Manager */ 
$em->remove($product); 
$em->flush(); 

यह स्पष्ट रूप से अखंडता बाधा उल्लंघन के कारण विफल हो जाता है ("हटाया नहीं जा सकता या एक माता पिता पंक्ति को अद्यतन: एक विदेशी कुंजी बाधा में विफल रहता है (products_tags, बाधा FK_E3AB5A2CBAD26311 विदेशी कुँजी (tag_id) संदर्भ tags (id)) '")।

जब मैं product_tags तालिका को विदेशी कुंजी पर हटाए गए कैस्केड को जोड़ता हूं तो यह काम करता है जैसा मैं चाहता हूं। मैं आसानी से TAG ($ em-> निकालें ($ टैग)) और PRODUCT ($ em-> निकालें ($ उत्पाद) हटा सकता हूं जो स्वचालित रूप से उत्पादों_टैग तालिका से संदर्भित पंक्तियों को हटा देता है।

मेरा कोड product_tags कैसे प्राप्त करना चाहिए ऑन कैस्केड के साथ टेबल विदेशी कुंजी हटाएं? मैं पहले से ही कैस्केड = {"सब"} से थक गया हूं लेकिन यह असफल रहा।

मुझे पता है, मैं उत्पाद के टैग संग्रह से सभी टैग हटा सकता हूं, लेकिन जैसा कि मैंने बताया है कि मैं चाहता हूं एक ही चरण में इसे प्राप्त करने के लिए, बस इकाई प्रबंधक वस्तु की विधि निकालने को फोन करके।

करता सिद्धांत वास्तव में उस की कमी है?

उत्तर

22

ठीक है, मैंने खुद को Doctrine2 दस्तावेज़ों में खोदने में कामयाब रहा;) समाधान ऑनडेले = "कैस्केड" से @JoinColumn पर जोड़ना है।

/** 
* @Entity 
* @Table(name="products") 
**/ 
class Product { 

    /** some other fileds here */ 

    /** 
    * @ManyToMany(targetEntity="Tag") 
    * @JoinTable(name="products_tags", 
    *  joinColumns={@JoinColumn(name="product_id", referencedColumnName="id", onDelete="cascade")}, 
    *  inverseJoinColumns={@JoinColumn(name="tag_id", referencedColumnName="id", onDelete="cascade")}  
    *  ) 
    */ 
    protected $tags; 

} 

ध्यान दें कि, झरना = { "सभी"}, वस्तु स्तर (अपने अनुप्रयोग में) पर किया जाता है, जबकि onDelete = "झरना" डेटाबेस स्तर पर है।

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