db_query에서 IN 절 사용


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

나는 내가 가까이 있다는 것을 알고 있었다.) 답변과 링크에 감사드립니다!
Olof Johansson 2016 년

문자열은 어떻습니까? node_types = array('node_type_1', 'node_type_2');
Serjas

상관 없습니다.
Berdir

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

Berdir의 답변을 참조하십시오.

드루팔 6

다음과 같이 할 수 있습니다 :

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

Drupal 6에는 db_placeholders가 필요합니다. 이는 주어진 값 배열에 필요한 자리 표시자를 보유하는 문자열을 생성합니다. 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

드루팔 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가 있습니다
Clive

권장 사항은 Drupal 8 업데이트입니다. 현재 허용되는 답변은 대괄호가 없기 때문에 Drupal 8에서 더 이상 작동하지 않습니다. Drupal 9에서 작동하지 않기 때문에이 답변을 거부하는 것은 다른 주요 버전이 불분명합니다. 사용자가 제대로 작동하는 답변을 얻지 못하게합니다. 정서는 분명한 예이며, 완벽은 선의 원수입니다.
Chris Calip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.