답변:
더 자세히 보았지만 실제로 이것을 설명하는 문서를 찾을 수 없었습니다.
내가 필요한 것은 users 테이블을 사용자에 대한 데이터를 보유하는 다른 두 테이블과 조인하는 방법이었습니다. 그러나 다른 두 테이블은 users 테이블과 '일대 다'관계에 있습니다. 즉, users 테이블을 두 테이블로 동시에 조인하려고하면 직교 조인으로 끝날 것입니다. . 그러나 필요한 것은 주어진 사용자와 관련된 두 개의 다른 테이블에있는 레코드 수를 계산하는 것이므로 하위 쿼리가 트릭을 수행 할 수 있어야합니다. 그러나 뷰 및 하위 쿼리에 대한 문서를 찾을 수 없으므로 여기에 내가 한 일이 있습니다.
hook_views_data ()를 통해 두 개의 더미 필드 ( '다운로드'및 '듣기'라고 함)를 만들었습니다. 필드의 정의는 다음과 같습니다.
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',
),
)
),
);
이제 사용자에 대한보기를 구성하면 '다운로드'및 '청취'필드가 나타납니다. 그러나 이제 쿼리를 실행하려고하면 더미 필드가 모두 더미 필드이므로 오류가 발생합니다. 존재하지 않습니다. 이러한 필드의 유일한 목적은 hook_views_query_alter () 구현에 몇 가지 교체 작업이 필요하다는 신호를 보내는 것입니다.
여기서의 트릭은 주어진 쿼리에 '다운로드'또는 '청취'필드가 포함되어 있는지 확인하는 것입니다. 그렇다면 쿼리에서 필드를 제거하고 하위 쿼리로 바꿉니다. 이 기능의 구현은 다음과 같습니다.
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;
}
}
}
}
하위 쿼리에 대해 제거 된 필드의 별칭을 재사용하고 있습니다. 이렇게하면 뷰는 하위 쿼리에서 반환 된 값이 실제로는 존재하지 않는 더미 필드에서 온 것으로 생각합니다.
그렇습니다. 카티 전 조인을받지 못하고 '다운로드'와 '듣기'가 모두 올바르게 계산됩니다.
하위 쿼리에서 필터 값을 상속해야 할 때까지 sbrattla의 솔루션을 사용했습니다. 이제 views_field_view 모듈을 사용 하여 개수 쿼리를 수행하는 별도의 뷰를 포함 시킵니다 . 필터 값을 보기 필드 (따라서 토큰)로 사용할 수있게 하는 views_filterfield 모듈 (내가 작성한)을 통해 컨텍스트 필터 값을 포함 된보기로 전달할 수 있습니다 .
이제 카운트 쿼리가 작동하고 기본 쿼리에서 노출 된 필터를 상속합니다.