Lượt xem 3 và truy vấn con?


12

Tôi đã có một chế độ xem tạo ra một truy vấn có nhiều tham gia. Điều này tạo ra một phép nối cartesian và tôi cần "chuyển đổi" các phép nối thành các truy vấn con.

Tôi đã xem qua tài liệu, kết quả tìm kiếm của Google và các nguồn khác, nhưng tôi không thể tìm thấy bất kỳ mô tả đúng đắn nào về cách tôi có thể định cấu hình Chế độ xem để thực hiện các truy vấn con. Tôi đã sử dụng hook_view_data () để định cấu hình các mối quan hệ (hiện được thực hiện dưới dạng tham gia). Có thể bằng cách nào đó có thể xác định các truy vấn con thông qua hook_view_data () hoặc tôi cần thực hiện một cách tiếp cận khác?

Bất kỳ lời khuyên đánh giá cao!

Câu trả lời:


5

Tôi nhìn xa hơn, nhưng thực sự không thể tìm thấy bất kỳ tài liệu nào mô tả điều này.

Điều tôi cần là một cách để tham gia bảng người dùng với hai bảng khác chứa dữ liệu cho người dùng. Tuy nhiên, hai bảng khác có mối quan hệ 'một-nhiều' với bảng người dùng, nghĩa là tôi sẽ kết thúc với một tham gia Cartesian nếu tôi cố gắng tham gia bảng người dùng với cả hai bảng này cùng một lúc . Tuy nhiên, vì tất cả những gì tôi cần là đếm số lượng bản ghi trong hai bảng khác được liên kết với bất kỳ người dùng cụ thể nào, một truy vấn con sẽ có thể thực hiện thủ thuật. Tuy nhiên, tôi không thể tìm thấy bất kỳ tài liệu nào về Lượt xem và truy vấn con - vì vậy đây là những gì tôi đã làm.

  1. Tạo hai trường giả

Tôi đã tạo hai trường giả (mà tôi sẽ gọi là 'tải xuống' và 'lắng nghe') thông qua hook_view_data (). Định nghĩa của lĩnh vực được liệt kê dưới đây.

function hook_views_data() {

  $data['users'] = array(
    'downloads' => array(
      'title' => t('Downloads'),
      'field' => array(
        'handler' => 'views_handler_field_numeric',
        'click sortable' => TRUE,
      ),
      'filter' => array(
        'handler' => 'views_handler_filter_numeric',
      ),
      'sort' => array(
        'handler' => 'views_handler_sort',
      ),
    ),
    'listens' => array(
      'title' => t('Listens'),
      'field' => array(
        'handler' => 'views_handler_field_numeric',
        'click sortable' => TRUE,
      ),
      'filter' => array(
        'handler' => 'views_handler_filter_numeric',
      ),
      'sort' => array(
        'handler' => 'views_handler_sort',
      ),
    )
  ),
);

Bây giờ, khi bạn định cấu hình chế độ xem cho người dùng, các trường 'Tải xuống' và 'Nghe' sẽ xuất hiện. Tuy nhiên, việc cố gắng chạy một truy vấn bây giờ sẽ dẫn đến một lỗi vì các trường giả sau khi tất cả đều là các trường giả. Họ không tồn tại. Mục đích duy nhất của các trường này là để báo hiệu cho việc triển khai hook_view_query_alter () của chúng tôi rằng nó cần thực hiện một vài thay thế.

  1. Triển khai hook_view_query_alter ()

Mẹo ở đây là kiểm tra thời tiết truy vấn đã cho bao gồm các trường 'Tải xuống' hoặc 'Nghe'. Nếu vậy, chúng tôi sẽ xóa các trường khỏi truy vấn và thay thế chúng bằng các truy vấn con. Việc thực hiện chức năng này diễn ra như dưới đây.

function mta_views_query_alter(&$view, &$query) {

  foreach ($query->fields as $field_key => &$field_values) {
    if ($field_values['table'] == 'users') {

      switch ($field_values['field']) {
        case 'downloads':
          unset($query->fields[$field_key]);
          $query->add_field(null, "(SELECT COUNT(*) FROM {fileusage} fu WHERE fu.externaluser = {users}.uid AND fu.action = 0)", $field_key);
          break;
        case 'listens':
          unset($query->fields[$field_key]);
          $query->add_field(null, "(SELECT COUNT(*) FROM {fileusage} fu WHERE fu.externaluser = {users}.uid AND fu.action = 1)", $field_key);
          break;
      }
    }
  }
}

Lưu ý rằng chúng tôi đang sử dụng bí danh của trường đã xóa cho truy vấn con. Theo cách đó, Lượt xem sẽ nghĩ rằng giá trị được trả về từ truy vấn con thực sự đến từ trường giả (mà sau tất cả không tồn tại).

Đó là. Chúng tôi sẽ không tham gia Cartesian và cả 'lượt tải xuống' và 'lượt nghe' đều được tính chính xác.


4

Tôi đã sử dụng giải pháp của sbrattla cho đến khi tôi cần có các giá trị bộ lọc kế thừa truy vấn con. Bây giờ tôi sử dụng mô-đun Views_field_view để nhúng một chế độ xem riêng thực hiện truy vấn đếm. Tôi có thể chuyển các giá trị bộ lọc ngữ cảnh cho chế độ xem được nhúng đó thông qua mô-đun view_filterfield (mà tôi đã viết) để làm cho các giá trị bộ lọc có sẵn dưới dạng các trường xem (và do đó là các thẻ).

Truy vấn đếm hiện hoạt động và kế thừa các bộ lọc được hiển thị trên truy vấn chính.

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.