У конкретному прикладі слід просто записати умову як:
$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()
приймає також об'єкт, що реалізує, SelectQueryInterface
як значення для $value
, такого як повернений db_select()
; проблема полягає в тому, що насправді ви можете просто використовувати його, коли значення $operator
дорівнює "IN"
. Див. Підселектори не працюють в умовах DBTNG, за винятком випадків, коли використовуються як значення для 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'
?