2012-04-26 11 views
5

के साथ कई संदर्भों में एक सरल एक को दोहराएं मैं डॉक्टर, मोंगो और ओडीएम सेटअप में नया हूं और ZF1 में इस सेटअप के साथ खेलते समय मैं एक सरल के साथ कई संदर्भों को दोहराने की कोशिश कर रहा हूं बाधा। यहां स्थिति है और कुछ हासिल करना चाहते हैं कि इसे कैसे प्राप्त किया जाए।सिद्धांत ओडीएम मोंगोडीबी - बाधा

यह एक सरल उपयोगकर्ता-> भूमिका मानचित्रण, तो एक एसक्यूएल स्थिति में मैं टेबल के लिए होता है इस प्रकार है:

 
Users 
- id 
- name 
- role_id 

Roles 
- id 
- name 

फिर एक विदेशी कुंजी बाधा उन पर निर्धारित किया जाएगा भूमिका को मैप करने के ROLE_ID आईडी। और एक भूमिका को हटाने पर एक विदेशी कुंजी बाधा ऑपरेशन को रोकने के लिए ट्रिगर किया जाएगा।

मैं डॉक्टरों मोंगोडीबी ओडीएम में एक ही लक्ष्य कैसे प्राप्त कर सकता हूं?

अब तक मैं अलग झरना विकल्पों के साथ @ReferenceOne @ReferenceMany सहित उपयोगकर्ता इकाई पर एनोटेशन के विभिन्न प्रकार के साथ खेला जाता है ...

विकल्प मेरे लिए छोड़ दिया अब @PreUpdate, @PreRemove जीवन चक्र की घटनाओं को लागू करने की है 'भूमिका' इकाई पर और फिर जांचें कि कोई उपयोगकर्ता भूमिका का उपयोग नहीं कर रहा है, अगर वे अद्यतन पर हैं तो मिलान के संदर्भ को बदल दें या हटा दें अपवाद को हटा दें।

क्या मैं यहां या खो गया हूं?

धन्यवाद,

सी

उत्तर

7

ऐसा ही कुछ मैं की तरह आप एसक्यूएल में होगा दो अलग-अलग 'टेबल' नहीं होती है। आपके पास उपयोगकर्ता की संपत्ति के रूप में भूमिका प्रकार होगा। और फिर यदि आप एक भूमिका प्रकार को हटाना चाहते हैं तो आप उस भूमिका के साथ सभी उपयोगकर्ताओं के भूमिका क्षेत्र में हेरफेर कर सकते हैं।

लेकिन आपके प्रश्न का उत्तर देने के लिए, मैं ऐसा ही करूंगा।

<?php 
class User { 
    /** @MongoDB\Id */ 
    protected $id; 
    /** @MongoDB\String */ 
    protected $name; 
    /** @MongoDB\ReferenceOne(targetDocument="Role", mappedBy="user") */ 
    protected $role; 

    //Getters/Setters 
} 

class Role { 
    /** @MongoDB\Id */ 
    protected $id; 
    /** @MongoDB\String */ 
    protected $name; 
    /** @MongoDB\ReferenceMany(targetDocument="User", inversedBy="role") */ 
    protected $users; 

    public function _construct() { 
     $this->users = new Doctrine\Common\Collections\ArrayCollection; 
    } 
    // Getters/Setters 

    public function hasUsers() { 
     return !$this->users->isEmpty(); 
    } 
} 

तब मैं अपने दस्तावेज़ प्रबंधक के साथ काम करने के लिए एक सेवा कक्षा तैयार करूंगा।

class RoleService { 
    public function deleteRole(Role $role) { 
     if (!$role->hasUsers()) { 
      // Setup the documentManager either in a base class or the init method. Or if your über fancy and have php 5.4, a trait. 
      $this->documentManager->remove($role); 
      // I wouldn't always do this in the service classes as you can't chain 
      // calls without a performance hit. 
      $this->documentManager->flush(); 
     } 
    } 
} 
+0

ग्रेट उत्तर, बहुत बहुत धन्यवाद! –

+1

कोई समस्या नहीं है। सिद्धांत के साथ शुरू करते समय मैं वही दर्द से गुजर चुका हूं। एक बार जब आप इसे लटका लेते हैं तो यह बहुत ही बढ़िया है! –

+1

मुझे लगता है कि यह अब तक वास्तव में अच्छा है। यह शीर्ष पर एक सेवा परत बनाने के लिए बहुत आसान बनाता है। एक छोटा सा बिंदु है मैं भूमिकाएं :: hasUsers() वापस आना चाहिए! $ यह-> उपयोगकर्ता-> है लक्षण(); बूलियन उलटा करने के लिए। आपकी मदद के लिए बहुत बहुत धन्यवाद और यह एक सपने की तरह काम करता है। –