Db_query içinde IN yan tümcesini kullanma


35

Yer tutucuları kullanarak sorguma bir IN cümlesi nasıl ekleyeceğimi bilemiyorum.

Bunun gibi bir şey olmasını isterdim:

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

Bu basit görevle ilgili herhangi bir belge bulamıyorum. Bunu başarmanın doğru yolu nedir?

Yanıtlar:


44

Diş tellerini özlüyorsun.

Bunu dene:

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

Daha fazla bilgi için, http://drupal.org/node/310072 , özellikle Yer Tutucu dizileri ile ilgili bölüme bakınız :

Yer tutucu dizileri

Drupal'ın veritabanı katmanı, ekstra bir yer tutucu özelliği içerir. Bir yer tutucu için girilen değer bir dizi ise, otomatik olarak karşılık gelen yer tutucunun olduğu gibi virgülle ayrılmış bir listeye genişletilir. Bu, geliştiricilerin kaç tane yer tutucuya ihtiyaç duyacaklarını sayma konusunda endişe duymayacakları anlamına gelir.

Bir örnek bu davranışı daha net hale getirmelidir:

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

Yakın olduğumu biliyordum;) Cevap ve bağlantı için teşekkürler!
Olof Johansson,

Peki ya ipler? node_types = array('node_type_1', 'node_type_2');
Serjas

Aynı, önemli değil.
Berdir

18

Drupal 8 için

Varlık sorgusu:

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

Sql Query (select), diğer sorgu türleri için aynı.

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

Drupal 7 için

Berdir'in cevabını görün.

Drupal 6 için

Böyle yapabilirsiniz:

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

db_placeholders, Drupal 6'da gerekli olup, verilen değerler dizisi için gerekli olan yer tutucuları tutan bir dize oluşturacaktır. Drupal 7, tüm bunları Berdir'in tarif ettiği gibi dahili olarak işler.


10

Drupal 7'deki Veritabanı API'sini Kullanma

Burada kullanmak için ne yapmanız ) (db_select yerine db_query () aynı sonuçlar için.

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

1

Drupal 6 Diziniz dizeler içeriyorsa, db_placeholders () ' a söylemeniz gerekir.

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

-1

Drupal 8 güncellemesi.

Ayrıca geçerli.

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

db_querykullanımdan kaldırılmıştır ve Drupal 9'da kaldırılacaktır. Bu noktada bir çözüm olarak önerilmemelidir. Ayrıca veritabanını, varlıklarla ilgili verileri sorgulamak için doğrudan kullanmamalısınız; Bunun için API'ler var
Clive

Tavsiye kesinlikle Drupal 8 güncellemesidir. Geçerli kabul edilen cevap artık Drupal 8 için geçerli değil çünkü köşeli ayraç yok. Bu cevabı reddetmek, çünkü Drupal 9 için işe yaramıyor, başka bir büyük versiyon önemsiz. Kullanıcıların sadece işe yarar bir cevap almasını engeller. Duygu net bir örneğidir, Mükemmel, yeterince iyi bir düşmandır.
Chris Calip
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.