Làm thế nào để tôi viết một truy vấn tham gia trái?


7

Tôi muốn nhận giá trị của "vid" khi biết ID nút và nhận giá trị của "name" cho các hàng trong đó "vid" bằng 2.

Nếu đó là một truy vấn đơn giản, tôi sẽ không biết cách viết nó; Tôi không biết làm thế nào để viết một truy vấn tham gia trái.

Truy vấn SQL "đơn giản" trong Drupal như sau:

$result = db_query('SELECT tid FROM {taxonomy_index} WHERE nid = :nid', array(':nid'=>$nid));

Truy vấn SQL thô tương đương như sau:

SELECT did, name FROM taxonomy_index as ti LEFT JOIN taxonomy_term_data AS ttd ON ti.tid = ttd.tid WHERE vid = 2 and nid = $nid

Câu trả lời:


11

Bạn không cần sử dụng db_select () cho truy vấn tĩnh như thế này. Trên thực tế, bạn không nên thấy Do db_select chậm hơn nhiều so với db_query, tại sao tôi lại muốn sử dụng nó? .

Bạn chỉ cần chuyển nó cho db_query (), điều duy nhất đã thay đổi là cách bạn thêm giữ chỗ.

$result = db_query('select tid,name from {taxonomy_index} as ti left join {taxonomy_term_data} as ttd on ti.tid=ttd.tid where vid=2 and nid=:nid', array(':nid' => $nid));
foreach ($result as $term) {
  // $term contains the object for the taxonomy term.
}

Xem http://drupal.org/developing/api/database để biết thêm thông tin và bài đăng trên blog của tôi để biết thông tin chuyển đổi cú pháp cơ sở dữ liệu Drupal 6 đến 7 chung chung.


cảm ơn nhiều. các liên kết là rất tốt. Tôi đã đọc nó. Nhưng tôi vẫn không biết truy vấn động là gì?
enjoylife

1
Một truy vấn động là những gì Sivaji đã viết: sử dụng db_select () để xây dựng một truy vấn với mã PHP. ví dụ hữu ích khi bạn có một truy vấn với các điều kiện khác nhau dựa trên một cái gì đó (cấu hình, quyền, các trang khác nhau ..)
Berdir

ở đoạn mã trên, tôi có thể thay đổi vid = 2 thành vid =: vid rồi mảng (': vid' => 2)). Tôi có nên làm điều này không? cảm ơn bạn
enjoylife

1
Nó không thực sự cần thiết, nhưng vâng, nó có thể có ý nghĩa. Đặc biệt là nếu bạn không muốn mã hóa vid đó, ví dụ, hãy sử dụng biến_get () để làm cho nó quá mức. vì vậy bạn sẽ làm gì array(':vid' => variable_get('yourmodule_vocabulary', 2)). Sau đó, nó sẽ mặc định là 2, nhưng bạn có thể ghi đè nó trong settings.php hoặc xây dựng biểu mẫu cài đặt quản trị viên cho nó.
Berdir

Đúng. Bạn cần phải làm, vid=2 to vid=:vid then array(':vid' => 2)để giữ cho mã của bạn tương thích trên các máy chủ cơ sở dữ liệu. Lõi Drupal theo cùng một mô hình.
Sivaji

25
$terms = db_select('taxonomy_index', 'ti')
  ->fields('ti', array('tid', 'name'));
$terms->leftJoin('taxonomy_term_data', 'ttd', 'ti.tid = ttd.tid');
$terms->condition('vid', 2)
  ->condition('nid', $nid)
  ->execute();

while ($term = $terms->fetch()) {
  // $term contains the object for the taxonomy term.
}

Làm thế nào để lấy kết quả? cảm ơn bạn
năm11

Nó có hoạt động không? Khi tôi cố gắng làm một cái gì đó giống hệt như vậy, tôi gặp một lỗi mà điều kiện () không phải là hàm thành viên.
Johnathan Elmore

4
Điều này sẽ không làm việc. Drupal tham gia không thể bị xiềng xích. Vì vậy, bạn sẽ đi:$terms = db_select(...)->fields(...); $terms->leftJoin(...); $terms->condition(...)->...
Neograph734 18/03/13

1
@ Neograph734 Tôi đề nghị chỉnh sửa dựa trên nhận xét của bạn.
FLY

0
        $catalog_pagination = db_select('taxonomy_index', 'ti')
          ->fields('pimg',array('uc_product_image_target_id','entity_id'))
          ->fields('fm',array('fid','filename'))    
          ->fields('ti', array('nid', 'tid'));
        $catalog_pagination->leftJoin('node__uc_product_image', 'pimg', 'pimg.entity_id = ti.nid'); 
        $catalog_pagination->leftJoin('file_managed', 'fm', 'fm.fid = pimg.uc_product_image_target_id');  
        $catalog_pagination->condition('ti.tid', $term_id);
        $catalog_pagination->orderBy('ti.nid', 'DESC');
        $catalog_pagination = $catalog_pagination->execute();
        $total_pages = $catalog_pagination->fetchAll();

-1

// Đừng quên hàm "fetch ALL ()":

$terms = db_select('taxonomy_index', 'ti')
  ->fields('ti', array('tid', 'name'));
$terms->leftJoin('taxonomy_term_data', 'ttd', 'ti.tid = ttd.tid');
$terms->condition('vid', 2)
  ->condition('nid', $nid)
  ->execute()
  **->fetchAll();** // an array of objects

**$i = 0;
while ($i < count($terms)) {
  $terms[i]->...
  // $terms[i] contains the object for the taxonomy term.
  $i++;
}**
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.