डायनामिक क्वेरीज़ का परिचय (Introduction to Dynamic Queries)
डायनामिक क्वेरीज़ वे क्वेरीज़ होती हैं, जिन्हें Drupal डायनामिक रूप से बनाता है, न कि सीधे SQL स्ट्रिंग के रूप में लिखी जाती हैं। सभी Insert, Update, Delete और Merge क्वेरीज़ डायनामिक होनी चाहिए। Select क्वेरीज़ स्थिर (static) या डायनामिक दोनों हो सकती हैं। इसलिए "डायनामिक क्वेरी" आम तौर पर डायनामिक Select क्वेरी को संदर्भित करती है।
नोट: Select क्वेरीज़ के 90% उपयोग मामलों में आपके पास एक स्थिर क्वेरी होगी। यदि यह प्रदर्शन के लिए critical path पर है, तो प्रदर्शन कारणों से आपको select() के बजाय query() का उपयोग करना चाहिए। डायनामिक क्वेरीज़ का उपयोग केवल तब करें जब क्वेरी के कुछ हिस्से बदल सकते हों (जैसे संदर्भ के आधार पर WHERE conditions जोड़ना) या यदि उन्हें संशोधित करने योग्य होना चाहिए।
सभी डायनामिक रूप से बनाई गई क्वेरीज़ उस डेटाबेस कनेक्शन ऑब्जेक्ट से बनाए गए क्वेरी ऑब्जेक्ट का उपयोग करके बनाई जाती हैं। स्थिर क्वेरीज़ की तरह, अधिकांश मामलों में क्वेरी ऑब्जेक्ट के लिए एक procedural wrapper का उपयोग किया जा सकता है। हालाँकि, बाद की क्वेरी निर्देश ऑब्जेक्ट मेथड्स के रूप में दिए जाते हैं, जिन्हें क्वेरी ऑब्जेक्ट पर कॉल किया जाता है।
डायनामिक Select क्वेरीज़ select() मेथड का उपयोग करके इस प्रकार शुरू की जाती हैं:
$database = \Drupal::database();
$query = $database->select('mytable', 'mt', $options);
इस उदाहरण में mytable क्वेरी के लिए बेस टेबल है; यानी FROM के बाद की पहली टेबल। ध्यान दें कि इसके चारों ओर ब्रेसेस की आवश्यकता नहीं है। क्वेरी बिल्डर इसे स्वचालित रूप से संभाल लेगा। दूसरा पैरामीटर टेबल का उपनाम है। यदि निर्दिष्ट नहीं किया गया है, तो टेबल का नाम ही उपयोग किया जाएगा। $options ऐरे वैकल्पिक है और स्थिर क्वेरीज़ में प्रयुक्त $options ऐरे के समान है।
$database->select() कॉल का रिटर्न मान Select प्रकार का ऑब्जेक्ट होता है। इसलिए इस कॉल के बाद $query वेरिएबल का प्रकार Select होगा। इस ऑब्जेक्ट में fields(), joins() और group() जैसे कई मेथड्स होते हैं, जिन्हें क्वेरी को और परिभाषित करने के लिए कॉल किया जा सकता है।
डायनामिक Select क्वेरीज़ बहुत सरल या बहुत जटिल हो सकती हैं। नीचे हम एक सरल क्वेरी के हिस्सों को देखेंगे, और आगे की सामग्री में हम Joins जैसी अधिक जटिल तकनीकों की समीक्षा करेंगे।
बड़ी तस्वीर
यहाँ उपयोगकर्ता टेबल की एक अपेक्षाकृत सरल क्वेरी है।
मान लीजिए कि हम एक डायनामिक क्वेरी बनाना चाहते हैं, जो लगभग इस स्थिर क्वेरी के बराबर हो:
$result = $database->query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");
इसका डायनामिक समकक्ष इस प्रकार शुरू होता है:
// Select प्रकार का ऑब्जेक्ट बनाएं।
$database = \Drupal::database();
$query = $database->select('users', 'u');
// क्वेरी ऑब्जेक्ट में विवरण जोड़ें: एक condition, fields और एक range.
$query->condition('u.uid', 0, '<>');
$query->fields('u', ['uid', 'name', 'status', 'created', 'access']);
$query->range(0, 50);
इसे अक्सर शॉर्टहैंड सिंटैक्स का उपयोग करके लिखा जाता है, जो एक साथ कई मेथड कॉल की अनुमति देता है। इसलिए ऊपर का कोड अक्सर इस प्रकार लिखा जाता है:
// Select प्रकार का ऑब्जेक्ट बनाएं।
$query = $database->select('users', 'u');
// क्वेरी ऑब्जेक्ट में विवरण जोड़ें: एक condition, fields और एक range.
$query->condition('u.uid', 0, '<>')
->fields('u', ['uid', 'name', 'status', 'created', 'access'])
->range(0, 50);
वास्तव में, कोड को और छोटा करके $database->select() को सीधे अन्य मेथड कॉल्स के साथ जोड़ा जा सकता है। यह इस प्रकार दिखता है:
// Select प्रकार का ऑब्जेक्ट बनाएं और सीधे विवरण जोड़ें:
// condition, fields और range.
$query = $database->select('users', 'u')
->condition('u.uid', 0, '<>')
->fields('u', ['uid', 'name', 'status', 'created', 'access'])
->range(0, 50);
यह क्वेरी उपयोगकर्ता प्रशासन पेज पर उपयोग किए गए सरल क्वेरी रूप का उदाहरण है, जिसे आगे की पढ़ाई के लिए संदर्भित किया जा सकता है।
क्वेरी चलाना
एक बार क्वेरी बन जाने के बाद, उसे कंपाइल और रन करने के लिए execute() मेथड कॉल करें।
$result = $query->execute();
execute() मेथड एक रिज़ल्ट सेट / स्टेटमेंट ऑब्जेक्ट लौटाएगा, जो $database->query() द्वारा लौटाए गए ऑब्जेक्ट के समान होता है, और इसे बिल्कुल उसी तरह इटरेट या फ़ेच किया जा सकता है:
$result = $query->execute();
foreach ($result as $record) {
// प्रत्येक $record के साथ कुछ करें।
}
नोट: मल्टी-कॉलम डायनामिक क्वेरी में निम्न मेथड्स का उपयोग करते समय सावधानी बरतें:
ये मेथड्स वर्तमान में कॉलम के लिए न्यूमेरिक इंडेक्स (0, 1, 2 आदि) की आवश्यकता रखते हैं, न कि टेबल उपनामों की। हालाँकि, क्वेरी बिल्डर लौटाए गए फ़ील्ड्स के लिए किसी निश्चित क्रम की गारंटी नहीं देता, इसलिए डेटा कॉलम्स का क्रम वैसा नहीं हो सकता जैसा आप अपेक्षा करते हैं। विशेष रूप से, अभिव्यक्तियाँ हमेशा फ़ील्ड्स के बाद जोड़ी जाती हैं, भले ही आप उन्हें पहले जोड़ें। (यह समस्या स्थिर क्वेरीज़ में नहीं होती, क्योंकि वे हमेशा आपके द्वारा निर्दिष्ट क्रम में डेटा कॉलम लौटाती हैं।)
डिबगिंग
किसी क्वेरी ऑब्जेक्ट के जीवनचक्र में किसी विशेष बिंदु पर वह कौन सा SQL उत्पन्न करता है, इसे देखने के लिए क्वेरी ऑब्जेक्ट को प्रिंट करें। आर्गुमेंट्स जाँचने के लिए, arguments() मेथड द्वारा लौटाए गए ऐरे को देखें:
echo $query; print_r($query->__toString()); print_r($query->arguments());