it-swarm-vi.com

Chọn các trường từ hai bảng bằng db_select ()

Tôi đang sử dụng db_select() và tôi không hiểu cú pháp của phương thức fields(). Tôi đang sử dụng join() để tham gia một bảng khác. Vì vậy, đối với các bảng tn, tôi muốn làm một cái gì đó như

SELECT t.tid, t.field1, t.field2, n.title, n.author 
FROM table t INNER JOIN node n ON t.nid = n.nid;

Tôi có

$results = db_select('table', 't')
  ->fields( ... )
  ->join('node', 'n', 'n.nid = t.nid')
  ->execute();

Nhưng như bạn có thể thấy, tôi bị mất tại fields(). Các ví dụ tôi đã thấy chỉ xác định các trường cho một bảng:

->fields('t', array('tid', 'field1', 'field2'))

Cú pháp mà tôi muốn sử dụng là gì?

15
user1359

Dễ dàng, chỉ cần gọi các trường () hai lần.

$query = db_select('table', 't');
$query->join('node', 'n', 'n.nid = t.nid');
$result = $query
  ->fields('t', array('tid', 'field1', 'field2'))
  ->fields('n', array('nid', 'field1', 'field2'))
  ->execute();

foreach ($result as $row) {
  // Do something with $row.
}

Bạn có thể gọi hầu hết các phương thức nhiều lần (nhiều trường, nhiều điều kiện, nhiều thứ tự sắp xếp, nhiều phép nối, ...).

Lưu ý rằng, như trong ví dụ của tôi, lệnh gọi tham gia () cần tách biệt và không thể bị "xâu chuỗi" (đó là thuật ngữ kỹ thuật để có nhiều cuộc gọi phương thức liên tiếp) vì nó không trả về đối tượng truy vấn mà là Tên cho bí danh bảng.

28
Berdir

Tham gia ngầm sẽ vẫn hoạt động với db_query (), nếu bạn không làm gì lạ mắt. Tôi không chắc chắn nếu điều này là thực hành xấu hay không. Tôi đã hỏi một lần trong IRC và không nhận được phản hồi từ bất kỳ ai. Vì vậy, nếu bạn có bất kỳ ai trong số những người còn lại từ D6, họ vẫn sẽ làm việc.

2
colan