Trong ví dụ cụ thể, bạn chỉ cần viết điều kiện như sau:
$query->condition('n.language', 'ab', '<>');
Trong trường hợp chung, khi bạn cần chọn các hàng trong cơ sở dữ liệu dựa trên các giá trị được trả về từ truy vấn phụ, bạn nên xem xét những điều sau:
"KHÔNG VÀO" được chấp nhận là nhà điều hành từ SelectQuery::condition()
. Trong thực tế, truy vấn sau đây sẽ được thực hiện:
$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);
}
Như đã báo cáo trong các mệnh đề có điều kiện ("subselects"), SelectQuery::condition()
cũng chấp nhận một đối tượng triển khai SelectQueryInterface
như giá trị cho $value
, như đối tượng được trả về bởi db_select()
; vấn đề là thực sự bạn chỉ có thể sử dụng nó khi giá trị $operator
bằng "IN"
. Xem phần phụ không hoạt động trong điều kiện DBTNG, trừ khi được sử dụng làm giá trị cho IN .
Cách duy nhất tôi có thể thấy để sử dụng toán tử "KHÔNG VÀO" với truy vấn phụ condition
là:
- Thực hiện truy vấn con để có được một mảng
Thực hiện truy vấn chính đặt điều kiện như trong đoạn mã sau
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
là mảng chứa kết quả của truy vấn phụ.
Mặt khác, bạn có thể sử dụng where()
như những người khác đã nói, chấp nhận một chuỗi cho phần truy vấn bạn cần thêm.
Hãy nhớ rằng db_select()
chậm hơn mà db_query()
; bạn nên sử dụng đầu tiên khi bạn biết các truy vấn có thể bị thay đổi bởi các mô-đun khác. Mặt khác, nếu các mô-đun khác không được sử dụng hook_query_alter()
để thay đổi truy vấn của bạn, bạn nên sử dụng db_query()
.
Trong trường hợp truy cập các nút, nếu bạn chỉ cần lấy các nút mà người dùng có quyền truy cập, thì bạn cần sử dụng db_select()
và thêm 'node_access'
dưới dạng thẻ của truy vấn, với SelectQuery::addTag()
. Ví dụ, blog_page_last()
sử dụng mã sau đây.
$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();
Mã tương tự được sử dụng bởi 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'
gì?