2016-01-15 3 views
5

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

उदाहरण के लिए मेरे पास इकाइयों का एक समूह है जो संबद्ध डेटाबेस तालिकाओं की एक श्रृंखला में मैप किए गए एसोसिएशन हैं। वे सभी OnetoMany संगठन हैं और उत्पाद पृष्ठों पर matrices में कीमतों के पदानुक्रम के रूप में कार्य करते हैं। वे के रूप में इतना प्रतिनिधित्व किया जा सकता है:

SitePage->SiteMatrix->SiteItems->SiteItemPrices. 

जुड़े मानचित्रण पूरी तरह से काम करता है, और जब मैं findBy विधि का उपयोग पाने के लिए जड़ वस्तु SitePage यह सरणियों जो श्रृंखला नीचे मैप की संस्थाओं का प्रतिनिधित्व करते हैं। दूसरे शब्दों में SitePage ऑब्जेक्ट में सभी matrices शामिल हैं, जिसमें सभी आइटम शामिल हैं जिनमें सभी कीमतें हैं। अब तक सब ठीक है।

मेरी समस्या यह है कि हर बार जब मैं अपनी साइट पर पृष्ठों की एक सूची प्राप्त करता हूं, तो सिद्धांत पूरे एसोसिएशन मैपिंग पेड़ पर चल रहा है और मुझे पूरे डाटाबेस के साथ लौट रहा है जो बहुत धीमा है। कभी-कभी मैं आईडी द्वारा अपनी साइटपेज इकाई प्राप्त करना चाहता हूं और सभी मैप किए गए संघों को शामिल नहीं करना चाहता हूं।

मैं संघों के आलसी और अतिरिक्त आलसी लोड हो रहा है में देखा है, लेकिन वे केवल कुछ कार्यों को प्रभावित है, और नहीं findBy आदि आधिकारिक दस्तावेज सहायक से दूर है लगते हैं: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

स्टैक ओवरफ़्लो पर अन्य समान प्रश्न हैं अनुत्तरित नहीं गए: Doctrine 2 Association Mapping Overhead?

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

विषय पर किसी भी जानकारी के लिए धन्यवाद।

+0

सिद्धांत डिफ़ॉल्ट रूप से आलसी लोड एसोसिएशन होना चाहिए। ऐसा लगता है जैसे आपके सभी संगठन उत्सुक लोडिंग के लिए सेट हैं। क्या आप किसी भी एसोसिएशन समस्याओं को रद्द करने के लिए अपने एसोसिएशन मैपिंग के साथ दो इकाइयों के लिए कोड जोड़ सकते हैं? – JimL

+0

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

उत्तर

2

जेएमएसएसरियलाइज़र बहिष्करण रणनीतियां आपकी मदद कर सकती हैं।

पहले, डिफ़ॉल्ट रूप से सभी गुण को बाहर:

// ... 

use JMS\Serializer\Annotation as JMS; 

/** 
* @ORM\Entity 
* @JMS\ExclusionPolicy("all") 
*/ 
class Foo 

फिर, बाहर या अपने गुण दर्शाने का चयन:

/** 
* @ORM\Column(type="string") 
* @JMS\Expose 
*/ 
protected $name; 

इसके अलावा, अपने संगठनों के लिए, आप MaxDepth उपयोग कर सकते हैं सीमित करने के लिए आपके परिणामों की संबंधित प्रविष्टियां। उदाहरण:

// Entity 
/** @MaxDepth(1) */ 
private $selfAssociatedEntries; 

// Controller 
use JMS\Serializer\SerializationContext; 

$serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks()); 

इस तरह, आपके इकाई इच्छा $selfAssociatedEntries धारावाहिक शामिल है, लेकिन $selfAssociatedEntries$selfAssociationEntries संपत्ति नहीं है।
क्रमबद्धता पहले मूल वस्तु तक ही सीमित है।

Groups एक शक्तिशाली सुविधा है कि आप कुछ कार्यों के लिए गुण का पर्दाफाश और एक अन्य के लिए उन्हें बाहर करने के लिए अनुमति देता है कर रहे हैं:

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
* @JMS\Groups({"default"}) // Set the group to expose the property 
*/ 
protected $name; 

अपने नियंत्रक में, समूह क्रमबद्धता के लिए इस्तेमाल किया सेट:

// Property 'name' is exposed 
$serializer->serialize($data, 'json', SerializationContext::create()->setGroups(array('default'))); 

के लिए अधिक जानकारी, दस्तावेज के Exclusion Strategies अध्याय देखें।

+0

इस अवधारणा को पूरी तरह से समझाने के लिए बहुत बहुत धन्यवाद। JMSSerializer बहिष्करण रणनीतियों का उपयोग करना एक बहुत शक्तिशाली उपकरण मैपिंग सिद्धांत एसोसिएशन बनाता है। रेफरी के लिए आधिकारिक डॉक्स - http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies – Asq

+0

आपका स्वागत है, आपके धैर्य के लिए धन्यवाद। यदि आपके पास maxDeprh का बेहतर स्पष्टीकरण है, तो मुझे कहने में संकोच न करें और मैं अपना सुधार करूंगा। – chalasr

+0

यह सब अच्छा है, लेकिन क्या यह अभी भी अंतर्निहित क्वेरी को प्रभावित करता है ?, यह प्रस्तुति है, क्वेरी अभी भी सही होने की आवश्यकता है? –

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