В конкретном примере вы должны просто написать условие как:
$query->condition('n.language', 'ab', '<>');
В общем случае, когда вам нужно выбрать строки в базе данных на основе значений, возвращаемых из подзапроса, вы должны рассмотреть следующее:
«НЕ В» принимается как оператор из 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);
}
Как сообщается в условных предложениях («Subselects»), 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'
?