Db_query এ IN ক্লজ ব্যবহার করা


35

স্থানধারকগুলি ব্যবহার করে কীভাবে আমার ক্যোয়ারিতে একটি আইএন ক্লজ যুক্ত করবেন তা আমি বুঝতে পারি না।

আমি এটি কিছু হতে চাই:

$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 , বিশেষত স্থানধারক অ্যারেগুলির অধ্যায়:

স্থানধারক অ্যারে

দ্রুপালের ডাটাবেস স্তরটিতে স্থানধারকদের একটি অতিরিক্ত বৈশিষ্ট্য রয়েছে। যদি কোনও স্থানধারকের জন্য পাস করা মানটি একটি অ্যারে হয় তবে এটি স্বয়ংক্রিয়ভাবে কমা দ্বারা পৃথক তালিকায় প্রাসঙ্গিক স্থানধারক হিসাবে প্রসারিত হবে। এর অর্থ বিকাশকারীদের কতগুলি স্থানধারীর প্রয়োজন তা গণনা করে চিন্তার দরকার নেই।

একটি উদাহরণে এই আচরণটি আরও স্পষ্ট করা উচিত:

<?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();

এসকিএল ক্যোয়ারী (নির্বাচন করুন), অন্যান্য ক্যোয়ারির ধরণের জন্য মূলত একই same

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

দ্রুপাল 7 এর জন্য

বারদিরের উত্তর দেখুন।

ড্রুপাল 6 এর জন্য

আপনি এটি এর মতো করতে পারেন:

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

ডিবি_প্লেসোল্ডারদের ড্রুপাল in-তে প্রয়োজনীয় যা একটি স্ট্রিং তৈরি করবে যা প্রদত্ত মানগুলির অ্যারের জন্য প্রয়োজনীয় স্থানধারককে ধরে রাখবে। ড্রুপাল 7 অভ্যন্তরীণভাবে বার্ডিরের বর্ণনা মতো এই সমস্ত পরিচালনা করে।


10

ড্রুপাল 7 এ ডাটাবেস এপিআই ব্যবহার করে

এখানে কিভাবে আপনি ব্যবহার করতে পারেন ) 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

ড্রুপাল 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

ড্রুপাল 8 আপডেট।

বৈধ।

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

db_queryঅবচয় করা হয়েছে এবং ড্রুপাল ৯-এ সরানো হবে It এই মুহুর্তে সমাধান হিসাবে এটি সুপারিশ করা উচিত নয়। সত্তা সম্পর্কিত তথ্য অনুসন্ধানের জন্য আপনার সরাসরি ডাটাবেস ব্যবহার করা উচিত নয়; এর জন্য এপিআই রয়েছে
ক্লাইভ

প্রস্তাবটি কঠোরভাবে দ্রুপাল 8 আপডেট। বর্তমান গৃহীত উত্তরটি আর ড্রুপাল 8 এর পক্ষে কাজ করে না, কারণ এতে স্কোয়ার বন্ধনী নেই। এই উত্তরটি প্রত্যাখ্যান করার জন্য কারণ এটি ড্রুপাল 9 এর জন্য কাজ করে না এবং অন্য একটি বড় সংস্করণ হ'ল সংক্ষেপে। এটি ব্যবহারকারীদের এমন উত্তর পাওয়া বন্ধ করে যা কেবল কাজ করে। অনুভূতি একটি স্পষ্ট উদাহরণ, পারফেক্ট যথেষ্ট ভাল শত্রু।
ক্রিস ক্যালিপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.