Drupal 7 में डेटाबेस के साथ काम — पाठ 4 — डायनेमिक क्वेरीज़ (SELECT)
अब हम Drupal Database API के सबसे दिलचस्प भाग — डायनेमिक क्वेरीज़ — तक पहुँच गए हैं। इन्हें “डायनेमिक” इसलिए कहा जाता है क्योंकि Drupal क्वेरी स्ट्रिंग को स्वतः तैयार करता है। सभी INSERT, UPDATE, DELETE और MERGE क्वेरीज़ डायनेमिक हो सकती हैं। SELECT क्वेरीज़ भी या तो स्टैटिक या डायनेमिक हो सकती हैं, लेकिन Drupal में SELECT के लिए भी डायनेमिक क्वेरीज़ का उपयोग करना बेहतर होता है।
सभी डायनेमिक क्वेरीज़ ऑब्जेक्ट्स के रूप में बनाई जाती हैं और आवश्यकता पड़ने पर निष्पादित की जाती हैं। जैसे स्टैटिक क्वेरीज़ के लिए procedural wrappers होते हैं, वैसे ही डायनेमिक क्वेरीज़ भी ऑब्जेक्ट्स के रूप में परिभाषित की जाती हैं और उनमें अतिरिक्त पैरामीटर्स चेनिंग के माध्यम से जोड़े जा सकते हैं।
db_select() — SELECT क्वेरीज़
डायनेमिक SELECT क्वेरी बनाने के लिए db_select() का उपयोग किया जाता है। उदाहरण:
<?php $query = db_select('node', 'n', $options); ?>
यहाँ ‘node’ उस टेबल का नाम है जिससे हम डेटा प्राप्त कर रहे हैं (SQL के FROM
के समान)। ध्यान दें — टेबल नाम को कर्ली ब्रेसेस {} में लपेटने की आवश्यकता नहीं है; Drupal का क्वेरी बिल्डर यह अपने आप करता है। दूसरा पैरामीटर टेबल का एलियस (alias) है, और तीसरा पैरामीटर $options एक वैकल्पिक ऐरे है।
एक सरल उदाहरण
<?php $query = db_select('users', 'u'); $query ->condition('u.uid', 0, '<>') ->fields('u', array('uid', 'name', 'status', 'created', 'access')) ->range(0, 50); $result = $query->execute(); ?>
यह क्वेरी इस SQL क्वेरी के बराबर है:
SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0;
Joins (टेबल जोड़ना)
एक से अधिक टेबल्स को जोड़ने के लिए join(), innerJoin(), leftJoin(), या rightJoin() का उपयोग करें:
<?php $table_alias = $query->join('user', 'u', 'n.uid = u.uid AND u.uid = :uid', array(':uid' => 5)); ?>
ऊपर का उदाहरण INNER JOIN बनाता है, जिसमें “user” टेबल “u” एलियस से जुड़ती है। यह सुनिश्चित करें कि आप हमेशा placeholder (जैसे :uid) का उपयोग करें ताकि SQL injection से बचा जा सके।
Fields (फील्ड्स जोड़ना)
किसी टेबल से विशिष्ट फील्ड्स प्राप्त करने के लिए addField() या fields() का उपयोग करें:
<?php $title_field = $query->addField('n', 'title', 'my_title'); ?>
या एक साथ कई फील्ड्स जोड़ने के लिए:
<?php $query->fields('n', array('nid', 'title', 'created', 'uid')); ?>
DISTINCT
डुप्लिकेट रिकॉर्ड्स हटाने के लिए:
<?php $query->distinct(); ?>
ध्यान रखें कि DISTINCT प्रदर्शन को प्रभावित कर सकता है, इसलिए केवल आवश्यक होने पर ही उपयोग करें।
Expressions (addExpression)
SQL एक्सप्रेशन्स जोड़ने के लिए:
<?php $count_alias = $query->addExpression('COUNT(uid)', 'uid_count'); $count_alias = $query->addExpression('created - :offset', 'uid_count', array(':offset' => 3600)); ?>
यह SQL में “COUNT(uid) AS uid_count” जैसा परिणाम देगा।
ORDER BY
रिज़ल्ट को सॉर्ट करने के लिए:
<?php $query->orderBy('title', 'DESC'); ?>
या कई फील्ड्स के अनुसार:
<?php $query->orderBy('created', 'DESC')->orderBy('title', 'ASC'); ?>
रैंडम क्रम (orderRandom)
रैंडम ऑर्डर में रिज़ल्ट पाने के लिए:
<?php $query->orderRandom(); ?>
GROUP BY
<?php $query->groupBy('uid'); ?>
इससे रिकॉर्ड्स UID के आधार पर समूहित होंगे।
LIMIT और RANGE
<?php $query->range(5, 10); ?>
यह 6वीं रिकॉर्ड से शुरू होकर 10 रिकॉर्ड्स लौटाएगा (0 से गिनती शुरू होती है)।
TableSort एक्सटेंडर
टेबल को sortable हेडर के साथ दिखाने के लिए:
<?php $query = $query ->extend('TableSort') ->orderByHeader($header); ?>
WHERE और HAVING कंडीशंस
कंडीशंस जोड़ने के लिए condition() या where() का उपयोग करें। HAVING क्लॉज़ के लिए havingCondition() या having() का प्रयोग किया जाता है। इनकी विस्तृत व्याख्या आगे के पाठ में की जाएगी।
क्वेरी चलाना (execute)
<?php $result = $query->execute(); foreach ($result as $record) { // प्रत्येक $record के साथ कुछ करें } ?>
या एकल वैल्यू के लिए:
<?php $title = $query->execute()->fetchField(); ?>
COUNT क्वेरी
रिकॉर्ड्स की गिनती प्राप्त करने के लिए:
<?php $num_rows = $query->countQuery()->execute()->fetchField(); ?>
Debugging (डिबगिंग)
क्वेरी स्ट्रिंग को प्रिंट करने के लिए:
<?php print_r($query->__toString()); ?>