2010-04-20 5 views
62

सिद्धांत में आप 2 तरीकों से DQL बना सकते हैं:सिद्धांत: Querybuild बनाम createQuery?

EntityManager :: createQuery:

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1'); 

QueryBuilder:

$qb->add('select', 'u') 
    ->add('from', 'User u') 
    ->add('where', 'u.id = ?1') 
    ->add('orderBy', 'u.name ASC'); 

मुझे आश्चर्य है कि क्या अंतर है और जो करना चाहिए मैं उपयोग करता हूं?

उत्तर

60
  1. डीक्यूएल पढ़ने के लिए आसान है क्योंकि यह एसक्यूएल के समान है। यदि आपको पैरामीटर के सेट के आधार पर क्वेरी को बदलने की आवश्यकता नहीं है तो यह शायद सबसे अच्छा विकल्प है।

  2. क्वेरी बिल्डर क्वेरी बनाने के लिए एक एपीआई है, इसलिए यदि आप पैरामीटर या फ़िल्टर के सेट पर पुनरावृत्ति की तरह गतिशील रूप से एक क्वेरी बनाने की आवश्यकता है तो यह आसान है। आपको अपनी क्वेरी बनाने, विभाजित करने या जो कुछ भी करने के लिए कोई स्ट्रिंग ऑपरेशन करने की आवश्यकता नहीं है।

+0

लेकिन पहले मामले में डीक्यूएल स्ट्रिंग को पार्स करने पर कोई ओवरहेड नहीं है? या निर्माता एक ही डीक्यूएल स्ट्रिंग को परिणाम के रूप में भी बनाता है? –

+2

हां, QueryBuilder आपके लिए DQL स्ट्रिंग बनाता है। उसके बाद, डीक्यूएल को किसी भी तरह से पार्स किया जाता है। – Dennis

31

क्वेरी बिल्डर, बस है क्वेरी बनाने के लिए इंटरफ़ेस का कहना है, की सुविधा देता है ... यह अधिक उपयोग करने के लिए सहज होना चाहिए, यह सिर्फ (विधि नहीं जोड़ है करता है), लेकिन यह भी तरह के तरीकों जहां(), andWhere (), से(), आदि। लेकिन अंत में, यह सिर्फ createQuery() विधि में आपके द्वारा उपयोग की जाने वाली क्वेरी को लिखता है। क्वेरी बिल्डर के और अधिक उन्नत उपयोग की

उदाहरण:

$em->createQueryBuilder() 
      ->from('Project\Entities\Item', 'i') 
      ->select("i, e") 
      ->join("i.entity", 'e') 
      ->where("i.lang = :lang AND e.album = :album") 
      ->setParameter('lang', $lang) 
      ->setParameter('album', $album); 
+0

आप जोड़ सकते हैं -> सेट पैरामीटर (सरणी ('x' => 'y', 'z' => 'w', ...)) –

13

वे विभिन्न प्रयोजनों है:

  • DQL का उपयोग करने के लिए जब आप अपनी पूरी क्वेरी पता आसान है।
  • क्वेरी बिल्डर होशियार है आप कुछ शर्तों के आधार पर आपकी क्वेरी का निर्माण करने के लिए है जब, लूप आदि
4

मुख्य अंतर यह है तरीकों को बुलाने की भूमि के ऊपर है। सरलता के लिए आपका पहला कोड नमूना (createQuery) एक विधि कॉल करता है, जबकि क्वेरीबिल्डर 4 बनाता है। सब कुछ के अंत में, वे एक स्ट्रिंग पर आते हैं जिसे निष्पादित किया जाना है, पहला उदाहरण आप इसे स्ट्रिंग दे रहे हैं, और दूसरा आप इसे कई जंजीर विधि कॉल के साथ बना रहे हैं।

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

+0

एक छोटा अवलोकन - मैं कहूंगा कि लगभग किसी भी समय किसी भी संख्या में खर्च होता है एसक्यूएलिंग से संबंधित PHP फ़ंक्शन कॉल का, हमेशा डीबी से वास्तविक परिणाम की प्रतीक्षा करने और खींचने के समय से अधिक महत्वपूर्ण होगा (ओआरएम के मामले में उनको हाइड्रेट करने का उल्लेख नहीं करना)। – userfuser

1

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

1) जुड़नार का उपयोग करें और डीबी के साथ वास्तविक बातचीत का परीक्षण करने के लिए: DQL के मामले में आप दो विकल्प हैं। जो मुझे कुछ हद तक परेशानी और ununitestish मिलती है।

2) जेनरेट किए गए डीक्यूएल कोड की जांच करने के लिए। जो आपके परीक्षण को बहुत नाजुक बना सकता है।

क्वेरीब्यूल्डर के साथ, आप इसे नकली के साथ प्रतिस्थापित कर सकते हैं और सत्यापित कर सकते हैं कि आवश्यक पैरामीटर के साथ "और जहां" विधि कहा जाता है। बेशक ऐसी विचार लागू नहीं हैं यदि आपकी क्वेरी सरल है और किसी भी पैरामीटर पर निर्भर नहीं है।