logo

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - नया लेआउट बिल्डर अनुभव❗

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - स्टाइलिश, कस्टमाइज़ेबल ब्लॉक टाइप्स: स्लाइडशो, टैब्स, कार्ड्स, एकॉर्डियन्स और कई अन्य। बैकग्राउंड, DOM बॉक्स, जावास्क्रिप्ट प्लगइन्स के लिए बिल्ट-इन सेटिंग्स। आज ही लेआउट बिल्डिंग का भविष्य अनुभव करें।

डेमो EBT मॉड्यूल्स EBT मॉड्यूल्स डाउनलोड करें

❗एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - नया पैराग्राफ्स अनुभव

एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - एनालॉजिकल पैराग्राफ आधारित मॉड्यूल्स का सेट।

डेमो EPT मॉड्यूल्स EPT मॉड्यूल्स डाउनलोड करें

स्क्रॉल

Drupal 7 में डेटाबेस के साथ काम — पाठ 12 — क्वेरी की शर्तें (WHERE, HAVING, LIKE)

14/10/2025, by Ivan

क्वेरी में शर्तें (conditions) जोड़ने से हम केवल उन्हीं रिकॉर्ड्स का चयन कर सकते हैं, जो कुछ विशेष मानदंडों को पूरा करते हैं — जैसे कि केवल पिछले दो सप्ताह में बनाई गई नोड्स, या वे टर्म जिनमें "Drupal" शब्द शामिल है। SQL में हम SELECT, UPDATE, DELETE क्वेरीज़ में शर्तें निर्दिष्ट करने के लिए WHERE और HAVING का उपयोग करते हैं। Drupal के डायनेमिक क्वेरी सिस्टम में भी शर्तों के साथ काम करने के लिए एक समान तंत्र लागू किया गया है। यह तंत्र सभी तीन प्रकार की क्वेरीज़ — चयन (SELECT), अद्यतन (UPDATE), और हटाने (DELETE) — के लिए समान रूप से कार्य करता है।

शर्तीय अभिव्यक्तियों (Conditional Expressions) की अवधारणा

शर्त (condition) एक विशेष अभिव्यक्ति में निहित होती है जो क्वेरी पर एक प्रतिबंध निर्धारित करती है।

संयोजन (AND, OR)

प्रत्येक शर्त कई उप-अभिव्यक्तियों से मिलकर बन सकती है, जो एक साथ जोड़ी जाती हैं। इन शर्तों को जोड़ने के लिए AND (और) तथा OR (या) ऑपरेटरों का उपयोग किया जाता है।

शर्त ऑब्जेक्ट

Drupal प्रत्येक शर्त के टुकड़े को QueryConditional क्लास के एक उदाहरण (instance) के रूप में प्रस्तुत करता है। यह क्लास शर्तीय ऑब्जेक्ट का प्रतिनिधित्व करती है।

आइए SQL क्वेरी का एक उदाहरण देखें:

क्वेरी:

SELECT FROM {mytable} WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))

शर्तीय भाग:

WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))

शर्त की उप-अभिव्यक्तियाँ:

(a = 1 AND b = 'foo' OR (c = 'bar'))
(c = 'bar')

संयोजन ऑपरेटर:

AND, OR

SELECT, UPDATE, और DELETE क्वेरीज़ के ऑब्जेक्ट्स को QueryConditionalInterface इंटरफ़ेस के माध्यम से कार्यान्वित किया जाता है, जो प्रत्येक प्रकार की क्वेरी के लिए आवश्यक विधियाँ प्रदान करता है। इसके बाद यह ऑब्जेक्ट QueryConditional में लिपटा होता है। आप QueryConditional क्लास को सीधे भी बुला सकते हैं।

प्रत्येक शर्तीय अभिव्यक्ति के हिस्से को AND के माध्यम से जोड़ा जाता है। यदि आवश्यक हो, तो कुछ हिस्सों को OR जैसे अन्य ऑपरेटरों से भी जोड़ा जा सकता है।

API

शर्तों के लिए दो मुख्य मेथड उपलब्ध हैं:

$query->condition($field, $value = NULL, $operator = '=')

condition() मेथड आपको क्वेरी की शर्त में फ़ील्ड, मान और ऑपरेटर निर्दिष्ट करने देता है। यह मेथड बाइनरी तुलना (TRUE/FALSE) के लिए उपयोग किया जाता है — जैसे कि =, <, >=, LIKE आदि। यदि कोई ऑपरेटर निर्दिष्ट नहीं किया गया, तो डिफ़ॉल्ट रूप से “=” उपयोग होता है। इस प्रकार, सामान्य तुलना के लिए आप बस लिख सकते हैं:

$query->condition('myfield', $value);

यह SQL में परिवर्तित हो जाएगा: myfield = :value, जहाँ :value को वेरिएबल $value के मान से प्रतिस्थापित किया जाएगा।

$query->where($snippet, $args = array())

where() एक वैकल्पिक मेथड है। हालाँकि, condition() का उपयोग अधिक अनुशंसित है। where() आपको एक सामान्य SQL स्निपेट लिखने देता है, जहाँ $snippet में SQL कोड होता है और $args में उसके लिए पैरामीटरों का ऐरे।

सामान्यतः, condition() का उपयोग where() की तुलना में अधिक सुरक्षित और सुविधाजनक होता है।

ऐरे के साथ शर्तें

कभी-कभी हमें ऐसी क्वेरी बनानी होती है जिसमें एक ही फ़ील्ड के लिए कई मान हों। ऐसे मामलों में हम मानों के एक ऐरे को क्वेरी में पास करते हैं। इसके लिए SQL में सबसे सामान्य ऑपरेटर हैं IN और BETWEEN

<?php
$query->condition('myfield', array(1, 2, 3), 'IN');
// परिणाम: myfield IN (:db_placeholder_1, :db_placeholder_2, :db_placeholder_3)
?>

यह क्वेरी उन सभी रिकॉर्ड्स को चुनेगी जिनमें myfield का मान 1, 2, या 3 है।

यदि हमें किसी सीमा (range) में आने वाले मान चाहिए, तो हम BETWEEN ऑपरेटर का उपयोग करते हैं:

<?php
$query->condition('myfield', array(5, 10), 'BETWEEN');
// परिणाम: myfield BETWEEN :db_placeholder_1 AND :db_placeholder_2
?>

यह क्वेरी उन सभी रिकॉर्ड्स को चुनेगी जिनका myfield मान 5 और 10 के बीच है।

नेस्टेड (विन्यस्त) शर्तें

condition() का पहला पैरामीटर एक और शर्त ऑब्जेक्ट स्वीकार कर सकता है, जिससे आप जटिल शर्तें बना सकते हैं। इस तरह, एक शर्त को दूसरी शर्त में नेस्ट किया जा सकता है और AND/OR ऑपरेटरों से संयोजित किया जा सकता है।

db_condition() एक हेल्पर है जो एक नया शर्तीय ऑब्जेक्ट लौटाता है। यह एक पैरामीटर स्वीकार करता है — शर्त का प्रकार (AND, OR, XOR)। आप तैयार हेल्पर्स जैसे db_or(), db_xor(), db_and() का भी उपयोग कर सकते हैं। उदाहरण देखें:

<?php
$query
  ->condition('field1', array(1, 2), 'IN')
  ->condition(db_or()->condition('field2', 5)->condition('field3', 6));
// परिणामस्वरूप SQL:
// (field1 IN (:db_placeholder_1, :db_placeholder_2) AND (field2 = :db_placeholder3 OR field3 = :db_placeholder_4))
?>

NULL मान

NULL मानों की जाँच करने के लिए निम्न मेथड्स का उपयोग करें:

<?php
$query->isNull('myfield');
// परिणाम: (myfield IS NULL)

$query->isNotNull('myfield');
// परिणाम: (myfield IS NOT NULL)
?>

आप isNull() और isNotNull() को where() और condition() के साथ संयोजित कर सकते हैं।

ध्यान दें: पुरानी शैली condition('myfield', NULL) अब अप्रचलित है — इसकी जगह isNull() और isNotNull() का उपयोग करें।

सबक्वेरी (Подзапрос)

condition() मेथड में $value के रूप में सबक्वेरी पास की जा सकती है। इसके लिए SelectQuery क्लास का उपयोग किया जाता है, जिसे db_select() मेथड से बनाया जाता है। यह आपको एक क्वेरी को दूसरी क्वेरी की शर्त में शामिल करने देता है।

सबक्वेरीज़ का उपयोग छोटे और सरल शर्तीय क्वेरीज़ के लिए किया जाता है। यदि आपको किसी जटिल क्वेरी की आवश्यकता है, तो condition() का उपयोग बेहतर रहेगा।

आइए सबक्वेरी के कुछ उदाहरण देखें:

db_delete()

<?php
db_delete('sessions')
  ->condition('timestamp', REQUEST_TIME - $lifetime, '<')
  ->execute();
// DELETE FROM {sessions} WHERE (timestamp < 1228713473)
?>

db_update()

<?php
db_update('sessions')
  ->fields(array(
    'sid' => session_id()
  ))
  ->condition('sid', $old_session_id)
  ->execute();
// UPDATE {sessions} SET sid = 'abcde' WHERE (sid = 'fghij');
?>

db_delete() с условием OR

<?php
// Пример из taxonomy_term_save():
$or = db_or()->condition('tid1', 5)->condition('tid2', 6);
db_delete('term_relation')->condition($or)->execute();
// DELETE FROM {term_relation} WHERE ((tid1 = 5 OR tid2 = 6))
?>