Db_query में खंड का उपयोग करना


35

मैं यह नहीं पता लगा सकता कि प्लेसहोल्डर्स का उपयोग करके, मेरी क्वेरी में एक IN क्लॉज कैसे जोड़ा जाए।

मैं चाहता हूँ कि यह कुछ इस तरह हो:

$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN :nids', array(':nids' => $nids));

इस सरल कार्य पर कोई दस्तावेज नहीं मिल सकता है। इसे प्राप्त करने का उचित तरीका क्या है?

जवाबों:


44

आपको ब्रेसेस याद आ रहे हैं।

इसे इस्तेमाल करे:

$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN (:nids)', array(':nids' => $nids));

अधिक जानकारी के लिए, http://drupal.org/node/310072 , विशेष रूप से प्लेसहोल्डर सरणियों का अध्याय देखें :

प्लेसहोल्डर सरण

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

एक उदाहरण को इस व्यवहार को स्पष्ट करना चाहिए:

<?php
// This code:
db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => array(13, 42, 144));

// Will get turned into this prepared statement equivalent automatically:
db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array(
  ':nids_1' => 13, 
  ':nids_2' => 42, 
  ':nids_3' => 144,
));

// Which is equivalent to the following literal query:
db_query("SELECT * FROM {node} WHERE nid IN (13, 42, 144)");
?>

मुझे पता था कि मैं करीब था;) उत्तर और लिंक के लिए धन्यवाद!
ओलोफ जोहानसन

तार के बारे में क्या? node_types = array('node_type_1', 'node_type_2');
सेरजस

वही, कोई फर्क नहीं पड़ता।
बेरदीर

18

द्रुपाल 8 के लिए

इकाई क्वेरी:

$query = \Drupal::entityTypeManager()->getStorage('entity_type')->getQuery();
$query->condition('field/property', [1, 2, 3], 'IN');
$ids = $query->execute();

Sql क्वेरी (चयन करें), अनिवार्य रूप से अन्य क्वेरी प्रकारों के लिए समान है।

$query = \Drupal::database()->select('table', 't');
$query->condition('column', [1, 2, 3], 'IN');
...

द्रुपाल 7 के लिए

देखें बरदीर का जवाब।

द्रुपाल के लिए ६

आप इसे इस तरह से कर सकते हैं:

$nids = array(1, 2, 3);
$placeholders = db_placeholders($nids);
$result = db_query("SELECT * FROM {node} WHERE nid IN ($placeholders)", $nids);

ड्रुपल 6 में db_placeधारकों की जरूरत है जो एक स्ट्रिंग बनाएंगे जो दिए गए मानों की सरणी के लिए आवश्यक प्लेसहोल्डर्स रखती है। Drupal 7 यह सब आंतरिक रूप से संभालता है जैसे Berdir वर्णन करता है।


10

Drupal 7 में डेटाबेस API का उपयोग करना

आप निम्न तरीके से उपयोग कर सकते हैं ) db_select ( के बजाय db_query () एक ही परिणाम के लिए।

$nids = array(1, 2, 3);
$query = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();
$nodes = $query->fetchAll();

1

Drupal 6 यदि आपके सरणी में तार हैं तो आपको db_placeholders () को बताने की आवश्यकता है

$colours = array('red', 'yellow', 'blue');
$placeholders = db_placeholders($colours,'text');
$result = db_query("SELECT * FROM {bricks} WHERE colour IN ($placeholders)", $colours);

-1

Drupal 8 अपडेट।

भी मान्य है।

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();

db_queryवंचित है और Drupal 9 में हटा दिया जाएगा। इसे इस बिंदु पर समाधान के रूप में अनुशंसित नहीं किया जाना चाहिए। आपको संस्थाओं से संबंधित डेटा की क्वेरी के लिए सीधे डेटाबेस का उपयोग नहीं करना चाहिए; वहाँ उस के लिए API हैं
क्लाइव

सिफारिश कड़ाई से Drupal 8 अद्यतन है। वर्तमान स्वीकृत उत्तर अब Drupal 8 के लिए काम नहीं करता है, क्योंकि इसमें वर्ग कोष्ठक का अभाव है। इस उत्तर को अस्वीकार करने के लिए क्योंकि यह ड्रुपल 9 के लिए काम नहीं करता है, एक अन्य प्रमुख संस्करण विवादास्पद है। यह उन उपयोगकर्ताओं को जवाब देना बंद कर देता है जो बस काम करते हैं। भावुकता इसका स्पष्ट उदाहरण है, परफेक्ट काफी अच्छे का दुश्मन है।
क्रिस कैलीप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.