2011-10-11 10 views
11

मुझे एक प्रोजेक्ट मिला है जहां मैं ग्राहक आदेशों से निपटता हूं। उनमें से कुछ ऑर्डर Amazon.com के माध्यम से किए जाते हैं। इसलिए मुझे एक ऑर्डर इकाई मिली है, और एक अमेज़ॅनऑर्डर इकाई जो इसे विस्तारित करती है। AmazonOrder द्वारा जोड़ा गया एक चीज़ AmazonOrderId है।सिद्धांत 2: पॉलिमॉर्फिक क्वेरीज़: सबक्लास के गुणों पर खोज

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

वह सामान एक क्वेरी-बिल्डर-निर्मित क्वेरी के साथ कार्यान्वित किया गया है जिसमें orX() अभिव्यक्ति है।

अब, मैं सभी ऑर्डर के खिलाफ मेल खाना चाहता हूं, लेकिन अगर वे अमेज़ॅन ऑर्डर हैं, तो AmazonOrderId के खिलाफ भी मेल खाते हैं।

और मैं अटक कर रहा हूँ - मुझे लगता है यह संभव

यहाँ कैसे मैं क्वेरी का निर्माण कर रहा हूँ है नहीं हो सकता है:

$qb->select('o,s')->from('PMS\Entity\Order', 'o');  
$qb->leftJoin('o.shippingInfo','s'); 
$qb->andWhere('o.status = :status'); 
$qb->setParameter('status',$status); 
$qb->andWhere(
    $qb->expr()->orX(
     $qb->expr()->like('o.id',':query') 
     $qb->expr()->like('s.address',':query') 
     $qb->expr()->like('s.city',':query') 
    ) 
); 
$qb->setParameter('query',$userQuery .'%'); 

$orders = $qb->getQuery()->getResult(); 

और मैं एक जोड़ने का तरीका को समझ नहीं सकता शर्त यह है कि कहते हैं, मोटे तौर पर, "या (आदेश एक AmazonOrder है और AmazonOrderId की तरह '$ userQuery%')"

कोई भी किसी भी जानकारी है? या तो इसे संभालने का कोई तरीका, या कम से कम एक पुष्टि है कि यह इस तरह से करने योग्य नहीं है?

उत्तर

21

यहाँ एक और समाधान है कि सिद्धांत 2.4 के साथ मेरे लिए काम करता है। (आप अपने सरल मामले को अपने उपयोग के मामले में अनुकूलित कर सकते हैं।)

मैंने इसे बिल्कुल एक बार कोशिश की है, लेकिन ऐसा लगता है।

+0

यह संयुक्त कुंजी के साथ इकाइयों के लिए भी अच्छी तरह से काम करता है। – Wilt

+0

अगर मैं इस जवाब को एक बार फिर वोट दे सकता हूं तो मैं इसे करूँगा! – Wilt

+0

इसके लिए धन्यवाद! रिकॉर्ड के लिए डीक्यूएल में: ओ ऑर्डर के साथ अमेज़ॅनऑर्डर एओ में शामिल करें o.id = ao.id – omgitsdrobinoha

2

एचएम, मुझे अपने आखिरी सिद्धांत परियोजना में समान समस्याएं थीं।

एक बार यह सिर्फ एक ही क्षेत्र था, इसलिए मैंने इसे मूल वर्ग में स्थानांतरित कर दिया - सबसे अच्छा समाधान नहीं, बल्कि काम किया। किसी अन्य मामले में जहां बहुत अधिक संपत्तियां होती हैं, इसलिए ये माता-पिता वर्ग को अव्यवस्थित कर देते थे। मैंने रिकॉर्ड आईडी के लिए खोज और लाने के लिए मूल एसक्यूएल क्वेरी की और फिर इकाइयों को लाने के लिए WHERE IN (...) डीक्यूएल का उपयोग किया।

एक समझौता सिद्धांत ResultSetMapping जो सीधे संस्थाओं के लिए एक देशी एसक्यूएल क्वेरी मैप कर सकते हैं हो सकता है, हालांकि हर बार मैं इसके साथ काम किया मैं इसे काफी अनाड़ी उपयोग करने के लिए मिल गया है और दो प्रश्नों के लिए भूमि के ऊपर (आईडी लाने & entites लाने) के रूप में उपेक्षित होने के लिए ऊपर उल्लिखित।

शायद आप अपने WHERE क्लॉज में INSTANCEOF ऑपरेटर के साथ कुछ हासिल कर सकते हैं, हालांकि मुझे नहीं लगता कि सिद्धांत आपको जिस तरह से चाहते हैं उसे पहचानने के लिए पर्याप्त स्मार्ट होगा।

$qb->select('o') 
    ->from('Order', 'o') 
    ->leftJoin('AmazonOrder', 'ao', 'WITH', 'o.id = ao.id') 
    ->andWhere('o.id like :query or ao.amazonOrderId like :query') 
    ->setParameter('query', $someQuery); 

तुम सिर्फ खुद के विशिष्ट उपवर्ग पर इकाई बाएं में शामिल होने:

+0

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

+0

यह भी देखें http://stackoverflow.com/a/19942431/560114 –

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