2011-08-12 16 views
50

पर सहेजा नहीं गया है मेरे पास श्रेणी और आइटम नामक दो PHP मॉडल वर्ग हैं। एक श्रेणी में कई आइटम हो सकते हैं और एक आइटम कई श्रेणियों से संबंधित हो सकता है।Symfony2-Doctrine: ManyToMany संबंध डेटाबेस

class Category 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Item", mappedBy="categories", cascade={"persist"}) 
    */ 
    private $items; 

    /** 
    * Add items 
    * 
    * @param Ako\StoreBundle\Entity\Item $items 
    */ 
    public function addItems(\Ako\StoreBundle\Entity\Item $items) 
    { 
     $this->items[] = $items; 
    } 

    /** 
    * Get items 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getItems() 
    { 
     return $this->items; 
    } 
} 

और::

class Item 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Category", inversedBy="items", cascade={"persist"}) 
    * @ORM\JoinTable(name="item_category", 
    * joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")}, 
    * inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} 
    *) 
    */ 
    private $categories; 

    /** 
    * Add categories 
    * 
    * @param Ako\StoreBundle\Entity\Category $categories 
    */ 
    public function addCategories(\Ako\StoreBundle\Entity\Category $categories) 
    { 
     $this->categories[] = $categories; 
    } 

    /** 
    * Get categories 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getCategories() 
    { 
     return $this->categories; 
    } 
} 
अब मेरी नियंत्रक में

: मैं दोनों वर्गों के लिए एक ManyToMany संबंध बनाया है

$em = $this->getDoctrine()->getEntityManager(); 

$item = $em->getRepository('AkoStoreBundle:Item')->find($item_id); 
$category = $em->getRepository('AkoStoreBundle:Category')->find($category_id); 

$category->addItems($item); 

$em->flush(); 
// Render the same page again. 

इस पेज में, मैं सभी वस्तुओं की सूची दिखाने के लिए एक चुनिंदा क्षेत्र में। उपयोगकर्ता एक आइटम का चयन कर सकते हैं, और इसे श्रेणी में जोड़ सकते हैं।

श्रेणी से संबंधित वस्तुओं की सूची फॉर्म के नीचे दिखाया गया है।

जब मैं फॉर्म जमा करता हूं, चयनित आइटम श्रेणी वस्तुओं की सूची में जोड़ा जाता है, और नीचे दिखाया गया है, लेकिन यह डेटाबेस में संग्रहीत नहीं है, और यदि पृष्ठ को रीफ्रेश करते हैं, तो यह गायब हो जाता है।

क्या कोई मेरी मदद कर सकता है? अग्रिम धन्यवाद।

+0

पद से ऊपर भूल गया मुझे इकाई में कई मानचित्रण के लिए कई मैप करने के लिए बहुत मदद करता है। क्या कोई अच्छा (पूर्ण) प्रलेखन लिंक है जो सभी प्रकार के डेटाबेस मैपिंग (इकाई मैपिंग) दिखाता है? – Kiran

उत्तर

83

आपकी श्रेणी इकाई रिश्ते के inverse side है।

addItems बदलते इस तरह देखने के लिए प्रयास करें:

public function addItem(\Ako\StoreBundle\Entity\Item $item) 
    { 
     $item->addCategory($this); 
     $this->items[] = $item; 
    } 

ध्यान दें कि मैं विलक्षण करने के लिए अपने बहुवचन नाम बदल, जब से तुम एक संस्थाओं, नहीं संग्रह के साथ काम कर रहे हैं।

+2

http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#picking-owning-and-inverse-side – ziiweb

+15

मुझे जांच के कुछ घंटे लग गए, लेकिन जब ऐसा होता है किसी प्रपत्र में, आपको संबंधित फॉर्म फ़ील्ड पर 'by_reference' => false' भी सेट करना होगा। अन्यथा, जोड़ें * और निकालें * विधियों को कभी नहीं कहा जाता है। – spackmat

+0

और ऐसा नहीं किया जैसा मैंने किया था: इस विधि को दोनों तरफ से न जोड़ें या आपके सर्वर को तब तक लॉन्च नहीं किया जाएगा जब तक कि आपका सर्वर पुनरारंभ नहीं हो जाता ... – Leogout

2

मैं एक ही समस्या थी ... मुझे लगता है कि आप

$category->addItems($item); 
$em->persist($category); 
$em->flush(); 
+11

के साथ उपयोगी है कोई 'persist() 'आवश्यक नहीं है क्योंकि दोनों संस्थाएं पहले से ही प्रबंधित हैं –

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