2013-01-04 15 views
15

मेरे सिम्फनी 2 प्रोजेक्ट में मेरे पास दो संबंधित संस्थाएं हैं: उपयोगकर्ता और पसंदीदा। उनके पास कई से अधिक रिश्ते हैं।Symfony2 में डेटाबेस से कई रिश्तों को सहेजना

मेरा आवेदन निम्नानुसार काम करता है: मेरे ट्विग-पेज में मेरे पास 'पसंदीदा में जोड़ें' बटन के साथ कुछ आइटम हैं। जब आप बटन पर क्लिक करते हैं तो मेरा नियंत्रक पसंदीदा कॉलम में item_id बचाता है। लेकिन फिर मैं उपयोगकर्ता को सहेजना चाहता हूं जिसने आइटम को अपने पसंदीदा में जोड़ा और यहां मेरा एप्लिकेशन विफल हो गया।

उपयोगकर्ता और पसंदीदा मौजूद हैं लेकिन उपयोगकर्ता और पसंदीदा के बीच जुड़ने वाला स्थान खाली रहता है। मुझे किसी भी तरह की त्रुटियां नहीं मिलती हैं।

इकाई उपयोगकर्ता

class Users implements AdvancedUserInterface 
{ 
    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"}) 
    * @ORM\JoinTable(name="user_has_favorite", 
    * joinColumns={ 
    *  @ORM\JoinColumn(name="user_id", referencedColumnName="user_id") 
    * }, 
    * inverseJoinColumns={ 
    *  @ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id") 
    * } 
    *) 
    */ 
    private $favorite; 

    public function __construct() 
    { 
     $this->favorite = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function addFavorite(\Geo\CityTroopersBundle\Entity\Favorites $favorite) 
    { 
     $this->favorite[] = $favorite; 

     return $this; 
    } 
... 

इकाई पसंदीदा

class Favorites 
{ 

    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Users", mappedBy="favorite", cascade={"persist"}) 
    */ 
    private $user; 

    public function __construct() 
    { 
     $this->user = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    public function addUser(\Geo\CityTroopersBundle\Entity\Users $user) 
    { 
     $this->user[] = $user;  
     return $this; 
    } 

मेरे नियंत्रक

public function showNewsAction() 
    { 
     $request = $this->get('request');  
     $itemId=$request->request->get('itemId'); 
     if($itemId != NULL) 
     { 
     //MAKE NEW FAVORITE AND ADD TO DATABASE LINKED WITH ITEM 
     $favorite = new Favorites(); 
     $favorite->setItemId($itemId); 

     //LINK FAVORITE ID WITH USER ID IN JOINCOLUMN 
     $userId = 6; 
     $em = $this->getDoctrine()->getEntityManager(); 

     $user = $em->getRepository('GeoCityTroopersBundle:Users')->find($userId); 

     $favorite->addUser($user); 
     $em->persist($favorite); 

     //I TRIED THIS TOO, BUT IT FAILED 
     /*$user->addFavorite($favorite); 
     $em->persist($user);*/ 

     $em->flush(); 
+0

यह असफल रहा ...? आपको कोई त्रुटि मिली है या यह चाल नहीं करता है? अगर आपको कोई त्रुटि है, तो कृपया इसे पोस्ट करें। – Pierrickouw

उत्तर

23

आप करीब थे:

यहाँ मेरी कोड है। कई सारे रिश्ते सिद्धांतों के लिए, आपको दोनों एड विधियों को कॉल करने की आवश्यकता है

$favorite->addUser($user); 
$user->addFavorite($favorite); 

$em->persist($favorite); 
$em->persist($user); 
$em->flush(); 

यह चाल चलाना चाहिए। the docs में वे ऐसा करते हैं, लेकिन इसका स्पष्ट रूप से उल्लेख नहीं करते हैं। निश्चित नहीं है कि क्यों या तो बहुत से लोग इसमें भाग लेते हैं (स्वयं शामिल)।

+0

यह टिप्पणी में कहा गया "मैंने इसे ट्राइड किया, लेकिन यह विफल हुआ"। शायद एक और त्रुटि है ...असल में, आपको केवल एसोसिएशन के स्वामित्व पक्ष को अपडेट करने की आवश्यकता है ताकि आपके उत्तर की पहली पंक्ति अनिवार्य नहीं है। – Pierrickouw

+0

जब मैं करता हूं -> $ पसंदीदा-> addUser ($ उपयोगकर्ता); $ उपयोगकर्ता-> जोड़ें पसंदीदा ($ पसंदीदा); $ em-> जारी रखें ($ पसंदीदा); $ em-> जारी रखें ($ उपयोगकर्ता); $ em-> फ्लश(); गंभीर त्रुटि: मैं इस त्रुटि मिलती है सी में एक सदस्य समारोह चाल() एक गैर वस्तु पर के लिए कॉल: \ XAMPP \ htdocs \ Symfony13 \ src \ भू \ CityTroopersBundle \ इकाई \ लाइन पर Users.php मैंने अपने कोड में देखा, और यह उस फ़ंक्शन को संदर्भित करता है जिसे मैं बिल्कुल नहीं कहता हूं। –

+0

जो मैं यूआरएल बना सकता हूं, मैंने दस्तावेज़ों को अपना लिंक अपडेट किया – Dheeraj

5

के रूप में यहां बताया गया है, केवल मालिक पक्ष कनेक्शन प्रबंधन के लिए जिम्मेदार है: http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#owning-and-inverse-side-on-a-manytomany-association

तो केवल

$user->addFavorite($favorite); 

जारी रहती है चाहिए, और

$favorite->addUser($user); 
0

की तरह नहीं सेड्रिक ने संकेत दिया , कई संबंधों के लिए कई लोगों के लिए एक रिकॉर्ड जोड़ना केवल एक दिशा में किया जाता है और यह इस बात पर निर्भर करता है कि आपने संबंध को कैसे परिभाषित किया है: जोड़ना संबंध की मूल इकाई द्वारा ही किया जा सकता है, तो आपके मामले में आप का उपयोग करना चाहिए:

$user->addFavorite($favorite); 
0

अपनी लाइन में:

@ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id") 

name="favorite_id" 

भाग को संदर्भित करता है शामिल तालिका में कॉलम, जबकि

referencedColumnName="favorite_id" 

आईडी को पसंदीदा तालिका में संदर्भित करता है जो सामान्य रूप से बस "आईडी" होता है। आपको कोशिश करनी चाहिए:

/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"}) 
* @ORM\JoinTable(name="user_has_favorite", 
* joinColumns={ 
*  @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="favorite_id", referencedColumnName="id") 
* } 
*) 
*/ 
private $favorite; 
संबंधित मुद्दे