Views3 및 하위 쿼리?


12

여러 조인을 수행하는 쿼리를 생성하는 뷰가 있습니다. 이것은 직교 조인을 생성하며 조인을 하위 쿼리로 "변환"해야합니다.

문서, Google 검색 결과 및 기타 소스를 살펴 보았지만 하위 쿼리를 수행하도록 뷰를 구성하는 방법에 대한 적절한 설명을 찾을 수 없습니다. hook_views_data ()를 사용하여 관계를 구성했습니다 (이제 조인으로 수행됨). 어떻게 든 hook_views_data ()를 통해 하위 쿼리를 정의 할 수 있습니까? 아니면 다른 접근법을 취해야합니까?

조언을 부탁드립니다!

답변:


5

더 자세히 보았지만 실제로 이것을 설명하는 문서를 찾을 수 없었습니다.

내가 필요한 것은 users 테이블을 사용자에 대한 데이터를 보유하는 다른 두 테이블과 조인하는 방법이었습니다. 그러나 다른 두 테이블은 users 테이블과 '일대 다'관계에 있습니다. 즉, users 테이블을 두 테이블로 동시에 조인하려고하면 직교 조인으로 끝날 것입니다. . 그러나 필요한 것은 주어진 사용자와 관련된 두 개의 다른 테이블에있는 레코드 수를 계산하는 것이므로 하위 쿼리가 트릭을 수행 할 수 있어야합니다. 그러나 뷰 및 하위 쿼리에 대한 문서를 찾을 수 없으므로 여기에 내가 한 일이 있습니다.

  1. 두 개의 더미 필드를 만들었습니다.

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 () 구현에 몇 가지 교체 작업이 필요하다는 신호를 보내는 것입니다.

  1. 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;
      }
    }
  }
}

하위 쿼리에 대해 제거 된 필드의 별칭을 재사용하고 있습니다. 이렇게하면 뷰는 하위 쿼리에서 반환 된 값이 실제로는 존재하지 않는 더미 필드에서 온 것으로 생각합니다.

그렇습니다. 카티 전 조인을받지 못하고 '다운로드'와 '듣기'가 모두 올바르게 계산됩니다.


4

하위 쿼리에서 필터 값을 상속해야 할 때까지 sbrattla의 솔루션을 사용했습니다. 이제 views_field_view 모듈을 사용 하여 개수 쿼리를 수행하는 별도의 뷰를 포함 시킵니다 . 필터 값을 보기 필드 (따라서 토큰)로 사용할 수있게 하는 views_filterfield 모듈 (내가 작성한)을 통해 컨텍스트 필터 값을 포함 된보기로 전달할 수 있습니다 .

이제 카운트 쿼리가 작동하고 기본 쿼리에서 노출 된 필터를 상속합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.