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.