Drupal 7 में डेटाबेस के साथ काम — पाठ 9 — रिकॉर्ड अपडेट क्वेरीज़ (UPDATE)
रिकॉर्ड अपडेट (UPDATE) क्वेरीज़ को हमेशा Drupal के क्वेरी बिल्डर (Query Builder) के माध्यम से बनाना चाहिए। विभिन्न डेटाबेस सिस्टम्स में बड़े ऑब्जेक्ट्स (LOB — Large OBjects, जैसे MySQL में TEXT) और बाइनरी बड़े ऑब्जेक्ट्स (BLOB — Binary Large OBjects) के लिए अलग-अलग हैंडलर होते हैं। इसलिए, इन मामलों को संभालने के लिए क्वेरी एब्स्ट्रैक्शन लेयर आवश्यक होती है, जिससे हर डेटाबेस ड्राइवर अपनी विशिष्ट प्रक्रिया लागू कर सके।
अपडेट क्वेरी db_update() फ़ंक्शन से शुरू होती है:
<?php $query = db_update('node', $options); ?>
यह कोड “node” टेबल में एक या अधिक रिकॉर्ड्स को अपडेट करेगा। ध्यान दें कि टेबल के नाम के चारों ओर आकृति कोष्ठक ({}
) लगाने की आवश्यकता नहीं है — क्वेरी बिल्डर यह स्वतः करता है।
अपडेट क्वेरी ऑब्जेक्ट Fluent API शैली का उपयोग करता है। इसका अर्थ है कि execute() को छोड़कर सभी मेथड्स वही ऑब्जेक्ट वापस लौटाते हैं, जिससे मेथड्स को आपस में जोड़ा जा सकता है (method chaining)। अधिकतर मामलों में इसका अर्थ यह है कि क्वेरी को किसी वेरिएबल में स्टोर करने की आवश्यकता नहीं होती।
अपडेट क्वेरी सामान्यतः कुंजी-मूल्य (key/value) जोड़ों और WHERE शर्तों के सेट से मिलकर बनती है। WHERE क्लॉज़ की संरचना हम अगले पाठ में विस्तार से देखेंगे, यहाँ केवल एक उदाहरण के रूप में इसे शामिल किया गया है।
एक विशिष्ट अपडेट क्वेरी इस प्रकार होगी:
<?php /* यह उदाहरण दिखाता है कि “node” टेबल में रिकॉर्ड्स को कैसे अपडेट किया जाए */ $num_updated = db_update('node') ->fields(array( 'uid' => 5, 'status' => 1, )) ->condition('created', REQUEST_TIME - 3600, '>=') ->execute(); ?>
ऊपर दिया गया उदाहरण निम्नलिखित SQL क्वेरी के समान है:
UPDATE {node} SET uid=5, status=1 WHERE created >= 1221717405;
यह क्वेरी उन सभी रिकॉर्ड्स को अपडेट करेगी जो पिछले एक घंटे में बनाए गए हैं — इन रिकॉर्ड्स के लिए uid = 5 और status = 1 सेट किया जाएगा।
fields() मेथड एक एसोसिएटिव ऐरे स्वीकार करता है, जिसमें यह बताया जाता है कि किन फ़ील्ड्स को अपडेट करना है और उनके लिए नए मान क्या होंगे। ध्यान दें कि INSERT क्वेरीज़ के विपरीत, UpdateQuery::fields() केवल एसोसिएटिव ऐरे को ही स्वीकार करता है। साथ ही, ऐरे के तत्वों का क्रम महत्वपूर्ण नहीं है — चाहे आप उन्हें किसी भी क्रम में लिखें।
execute() मेथड उन रिकॉर्ड्स की संख्या लौटाता है जो वास्तव में अपडेट किए गए हैं। हालाँकि, यह ध्यान देना महत्वपूर्ण है कि यह संख्या उन सभी रिकॉर्ड्स के बराबर नहीं होती जो WHERE शर्त से मेल खाते हैं। उदाहरण के लिए, यदि कुछ रिकॉर्ड्स पहले से ही uid = 5 और status = 1 रखते हैं, तो वे WHERE शर्त से मेल खाएँगे, लेकिन वास्तव में अपडेट नहीं होंगे क्योंकि उनके मान पहले से ही समान हैं।
इसलिए, अपडेट क्वेरी द्वारा लौटाई गई संख्या यह नहीं दर्शाती कि टेबल में कितनी पंक्तियाँ uid = 5 और status = 1 के साथ मौजूद हैं — यह केवल बताती है कि वास्तव में कितनी पंक्तियाँ बदली गई हैं।