web-gelistirme-sc.com

Db_query içinde IN yan tümcesi kullanma

Yer tutucuları kullanarak, sorguya bir IN yan tümcesi nasıl ekleyeceğinizi anlayamıyorum.

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 bulunamıyor. Bunu başarmanın doğru yolu nedir?

37
Olof Johansson

Diş telleri eksik.

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 de Yer Tutucu diziler hakkındaki bölüme bakın:

Yer tutucu diziler

Drupal'ın veritabanı katmanı ek bir yer tutucu özelliği içerir. Bir yer tutucu için iletilen değer bir diziyse, karşılık gelen yer tutucunun yaptığı gibi otomatik olarak virgülle ayrılmış bir listeye genişletilir. Bu, geliştiricilerin kaç tane yer tutucusuna ihtiyaç duyacakları konusunda endişelenmelerine gerek olmadığı 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)");
?>
46
Berdir

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 Sorgusu (select), temel olarak diğer sorgu türleri için aynıdır.

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

Drupal 7 için

Berdir'in cevabına bakınız.

Drupal 6 için

Bunu şöyle yapabilirsiniz:

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

db_placeholders gerekli Drupal 6 verilen değer dizisi için gerekli yer tutucuları tutan bir dize oluşturacak. Drupal 7 Berdir açıkladığı gibi tüm bunları dahili olarak ele .

18
googletorp

Drupal 7 içinde Veritabanı API'sını kullanma)

Aynı sonuçlar için db_query () yerine db_select () kullanabilirsiniz.

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

Drupal 6 Dizinizde dizeler varsa db_placeholders ()

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