2012-02-01 13 views
18

मुझे कई रिश्तों के साथ कुछ परेशानी हो रही है। मेरे पास Users और Assets है। मैं उपयोगकर्ताओं को संपत्ति पृष्ठ पर किसी संपत्ति को असाइन करने में सक्षम होना चाहता हूं।सिम्फनी 2 सिद्धांत 2 कई फॉर्मों में से कई को सहेजने वाली संस्थाएं

नीचे दिए गए कोड में संपत्ति बनाने/संपादित करते समय उपयोगकर्ताओं की एक सूची प्रदर्शित होती है, हालांकि उपयोगकर्ता चेकबॉक्स में किए गए परिवर्तन सहेजते नहीं हैं, जबकि शेष डेटा जारी रहता है।

यदि मैं mysql क्लाइंट के माध्यम से user_assets में कोई प्रविष्टि जोड़ता हूं, तो ये परिवर्तन संपत्ति सूची में दिखाए जाते हैं।

उपयोगकर्ता

class User extends BaseUser 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Asset", inversedBy="users") 
    */ 
    private $assets; 
} 

एसेट

class Asset 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="assets") 
    */ 
    private $users; 
} 

AssetType

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $form = $builder 
     ->add('users', null, array(
      'expanded' => true, 
      'multiple' => true 
     )) 
     ->getForm(); 

    return $form; 
} 
+0

आप 'null' को' chanage नहीं करना चाहिए EntityType'? शून्य से आपका क्या मतलब है ?! – Trix

उत्तर

29

किसी कारण मैं पाने के लिए सिद्धांत मैपिंग स्विच करने के लिए किया था के लिए:

Asset: 
/** 
* @ORM\ManyToMany(targetEntity="Adaptive\UserBundle\Entity\User", inversedBy="assets") 
* @ORM\JoinTable(name="user_assets") 
*/ 
private $users; 

User: 
/** 
* @ORM\ManyToMany(targetEntity="Splash\SiteBundle\Entity\Asset", mappedBy="users") 
*/ 
private $assets; 

अब जब मैं संपत्ति को बचाने के यह जुड़े उपयोगकर्ताओं को बचाता है। मुझे बिल्डर को परिभाषित करने की आवश्यकता नहीं थी-> एक इकाई या संग्रह के रूप में जोड़ें। मैं बस यह शून्य गुजरती हैं और यह मानचित्रण की जानकारी का उपयोग करता है इकाई की जानकारी में भरने के लिए:

AssetType: 
->add('users', null, array('expanded' => "true", "multiple" => "true")) 

नहीं बिल्कुल यकीन है कि मैं क्यों inversedBy और एसेट विरुद्ध उपयोगकर्ता पर JoinTable जानकारी है करने के लिए आवश्यक है, लेकिन यह काम कर रहा है अभी व!

सुझावों के लिए धन्यवाद !!!

+0

मुझे इसी तरह की समस्याएं थीं। दूसरों को सुझाव: सुनिश्चित करें कि आपके सभी एकवचन/बहुवचन वे हैं जो उन्हें माना जाता है, और यदि आपकी संस्थाओं में से कोई भी बहु-अवधि का नाम है (जैसे 'कूलड्यूड'), तो आपको यह जानकर लाभ हो सकता है कि सिद्धांत डिफ़ॉल्ट है मान लें कि आपका टेबल नाम उस के निचले-संस्करण वाले संस्करण है, उदाहरण के लिए 'Cooldude'। यदि यह वास्तव में 'cool_dude' है, तो मुझे लगता है कि आपको इसे स्पष्ट रूप से सेट करना होगा। आप देख सकते हैं कि सिद्धांत दस्तावेज़ों में कैसे। http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html#many-to-many-bidirectional –

+0

समस्या तब होती है जब आप एक समान रूप चाहते हैं विपरीत पक्ष: यह काम नहीं करेगा। –

+0

समाधान मेरे लिए काम नहीं कर रहा है, मेरी जॉइन टेबल हमेशा खाली है! – Fabien

0

आप उपयोग करने की आवश्यकता 'संग्रह' छी आपके फॉर्म में एलडी प्रकार।

$builder->add('users', 'collection', array(
    'type' => new UserType(), 
    'prototype' => true, 
    'allow_add' => true, 
    'allow_delete' => true 
)); 

आपको पहले स्पष्ट रूप से UserType() फ़ॉर्म बनाने की आवश्यकता है।

http://symfony.com/doc/current/cookbook/form/form_collections.html

http://symfony.com/doc/current/reference/forms/types/collection.html

+0

मैंने सोचा कि शून्य से गुज़रने से मुझे लगता है कि यह मेरे सिद्धांत मैपिंग के माध्यम से यह प्रकार है। मेरे पास संपत्तियों की श्रेणियों का उपयोग करके एक समान सेटअप है और यह बहुत अच्छा काम करता है। यह कोड है जो मुझे श्रेणी संग्रहों को पॉप्युलेट करना है: -> जोड़ें ('श्रेणियां', शून्य, सरणी ('विस्तारित' => "सत्य", "एकाधिक" => "सत्य")) ... मैं भी नहीं करता संपत्ति में उपयोगकर्ताओं के लिए क्रूड कार्यक्षमता जोड़ने की आवश्यकता है, बल्कि मुझे बस उस संपत्ति को वर्तमान उपयोगकर्ता को असाइन करने में सक्षम होना चाहिए –

+1

वास्तव में, विस्तार से सिद्धांत मेटाडेटा के आधार पर एक अनुमानक जोड़ता है। यदि आपने अपने ManyToMany एसोसिएशन को सही तरीके से परिभाषित किया है, तो टाइप अनुमानक आपके फ़ील्ड को 'संग्रह' के रूप में कॉन्फ़िगर करेगा। * सही * से, मेरा मतलब है कि एसोसिएशन के ** मालिक ** को आपके मामले में 'संपत्ति' होना चाहिए, यही कारण है कि आपको अपना मानचित्रण उलटा करना पड़ा। – Florian

+0

'EntityType' +' विस्तृत '+' एकाधिक 'के साथ समस्या क्या है? – Trix

4

पहले आप एनोटेशन में बैकस्लैश उपसर्ग कम हो जाना चाहिए पर (देखें नोटिस here):

यहाँ सभी जानकारी आप कोड नमूने भी शामिल है, की आवश्यकता होगी है।

और तुम इकाई क्षेत्र प्रकार का उपयोग करने की जरूरत है: यह काम करने के लिए

$builder->add('users', 'entity', array(
    'class' => 'AdaptiveUserBundle:User', 
    'expanded' => true, 
    'multiple' => true, 
    'query_builder' => function(EntityRepository $er) { 
     return $er->createQueryBuilder('u') 
      ->orderBy('u.username', 'ASC'); 
    }, 
)); 
17
नहीं

बिल्कुल यकीन है कि मैं क्यों inversedBy और एसेट विरुद्ध उपयोगकर्ता पर JoinTable जानकारी है करने के लिए आवश्यक है, लेकिन यह अब काम कर रहा है!

आपके परिवर्तनों को अनदेखा करने का कारण यह है कि सिद्धांत केवल संबंध के स्वामित्व वाले पक्ष (जैसे @ फ्लोरियन ने कहा) द्वारा बदलता रहता है।http://docs.doctrine-project.org/en/latest/reference/unitofwork-associations.html

9

अजीब पर्याप्त मैं 2016 में एक ही समस्या का सामना करना पड़ा है और अभी भी कठिन समय समाधान खोजने में कठिनाई हुई:

यह जहां इस व्यवहार से समझाया गया है सिद्धांत के प्रलेखन के लिए लिंक है। मैं इसे भविष्य Googler के लिए साझा करेंगे:

समस्या क्या सिम्फोनी अनिवार्य है कि आप प्रपत्र को बचाने जब यह है कि:

$asset->getUsers()->add($user)

और क्योंकि आप संबंध के व्युत्क्रम पक्ष पर कर रहे हैं यह आपके परिवर्तनों को जारी नहीं रखेंगे।

क्या तुम सच में की जरूरत है ताकि यह कॉल करने के लिए है इस:

$asset->addUser($user)

कहाँ adduser() एसेट इकाई पर निम्नलिखित तरीके से परिभाषित किया गया है:

public function addUser(User $user) 
{ 
    //add to the inverse side 
    $this->users->add($user); 

    //add on the owning side (only this is persisted) 
    $user->addAsset($this); //$user->assets->add($asset); 
} 

इसलिए सिम्फनी का उपयोग $asset->addUser() विधि बनाने के लिए, आपको

सेट करना चाहिए

'by_reference' => false

AssetType फार्म के लिए अपने users मैदान पर। यहां इस सेटिंग http://symfony.com/doc/current/reference/forms/types/form.html#by-reference

याद रखें कि आप भी उसी तरह से removeUser() विधि परिभाषित करने की जरूरत (इतना है कि यह मालिक संबंध से इकाई को हटाता है) के बारे में

अधिक

+0

यह स्वीकार्य उत्तर होना चाहिए।मैं सोच रहा था, कुछ रेट्रो-पोस्टिंग कर रहा हूं, क्यों कोई भी इसे नहीं लिखा और आखिरकार आप के साथ आया। अच्छा है। – DonCallisto

+0

** संपत्ति ** यहां पक्ष का मालिक है, इस प्रकार यह [सिद्धांत दस्तावेज़ीकरण] के साथ संघर्ष करता है (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html# स्वामित्व-और-विपरीत-साइड-ऑन-ए-ओन्टोमनी-एसोसिएशन) – Trix

+0

@ टिक्स धन्यवाद, मैंने अभी इसे फिर से जांच लिया है और वास्तव में उपयोगकर्ता/संपत्तियों का भ्रम था। मैंने एक संपादन किया - समाधान अभी भी वही है, मैं केवल परिवर्तनीय नामों को समायोजित करने के लिए समायोजित करता हूं। –

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