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.
- 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ế.
- 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.