구체적인 예에서는 다음과 같이 조건을 작성해야합니다.
$query->condition('n.language', 'ab', '<>');
하위 쿼리에서 반환 된 값을 기준으로 데이터베이스에서 행을 선택해야하는 일반적인 경우 다음 사항을 고려해야합니다.
의 연산자로 "NOT IN"이 허용됩니다 SelectQuery::condition()
. 실제로 다음 쿼리가 실행됩니다.
$query = db_select('node', 'n')->fields('n');
$query->condition('n.nid', array(1, 2, 3), 'NOT IN');
$nodes = $query->execute();
foreach ($nodes as $node) {
dsm($node->nid);
}
조건절 ( "하위 선택") 에보고 된대로 ;에 의해 반환 된 것과 같은 값을 SelectQuery::condition()
구현하는 객체도 허용 합니다 . 문제는의 값 이 같을 때 실제로 사용할 수 있다는 것 입니다. IN 값으로 사용되는 경우를 제외하고 DBTNG 조건에서 부속 선택이 작동하지 않음을 참조하십시오 .SelectQueryInterface
$value
db_select()
$operator
"IN"
하위 쿼리와 함께 "NOT IN"연산자를 사용하는 유일한 방법 condition
은 다음과 같습니다.
- 하위 쿼리를 실행하여 배열을 얻습니다.
다음 스 니펫에서와 같이 조건을 설정하여 기본 쿼리를 실행하십시오.
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
하위 쿼리의 결과를 포함하는 배열입니다.
그렇지 않으면 where()
다른 사람들이 말한 것처럼 사용할 수 있으며 추가 해야하는 쿼리 부분에 문자열을 허용합니다.
db_select()
느리다는 점 을 명심하십시오 db_query()
. 쿼리가 다른 모듈에 의해 변경 될 수 있음을 알고있는 경우 첫 번째를 사용해야합니다. 그렇지 않으면 다른 모듈이 hook_query_alter()
쿼리를 변경하는 데 사용되지 않으면 을 사용해야합니다 db_query()
.
노드에 액세스하는 경우 사용자가 액세스 할 수있는 노드 만 얻으려면을 사용 하여 쿼리의 태그 로 사용 db_select()
하고 추가 해야합니다 . 예를 들어 다음 코드를 사용합니다.'node_access'
SelectQuery::addTag()
blog_page_last()
$query = db_select('node', 'n')->extend('PagerDefault');
$nids = $query
->fields('n', array('nid', 'sticky', 'created'))
->condition('type', 'blog')
->condition('status', 1)
->orderBy('sticky', 'DESC')
->orderBy('created', 'DESC')
->limit(variable_get('default_nodes_main', 10))
->addTag('node_access')
->execute()
->fetchCol();
비슷한 코드가 사용됩니다 book_block_view()
.
$select = db_select('node', 'n')
->fields('n', array('title'))
->condition('n.nid', $node->book['bid'])
->addTag('node_access');
$title = $select->execute()->fetchField();
SELECT nid FROM node WHERE language != 'ab'
? 의 차이점은 무엇 입니까?