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


15

Tôi đang sử dụng db_select()và tôi không hiểu cú pháp của fields()phương pháp. 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 thấy, tôi đang lạc lố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ì?

Câu trả lời:


28

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 phải 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.


2

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 đây có phải là thực hành xấu hay không. Tôi đã hỏi một lần ở IRC và không nhận được phản hồi từ bất cứ ai. Vì vậy, nếu bạn có bất kỳ thứ gì còn sót lại từ D6, chúng vẫn sẽ hoạt động.


3
Sử dụng db_query () là hoàn toàn tốt (Nó thực sự được khuyến nghị vì lý do hiệu suất) trừ khi có lý do rõ ràng cho việc sử dụng db_select (). Tôi đã nêu ra những lý do ở đây: drupal.stackexchange.com/questions/1200/ trên
Berdir

Tuyệt quá! Tôi đã quá lười biếng để chuyển đổi của tôi anyway. ;)
colan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.