Görüntüleme3 ve alt sorgular?


12

Birden fazla birleştirme yapan bir sorgu üreten bir görünüm var. Bu kartezyen bir birleştirme üretir ve ben alt sorgulara "dönüştürmek" gerekir.

Dokümanları, Google arama sonuçlarını ve diğer kaynakları inceledim, ancak Views'ı alt sorgular yapmak için nasıl yapılandırabileceğime dair iyi bir açıklama bulamıyorum. İlişkileri yapılandırmak için hook_views_data () yöntemini kullandım (şimdi birleştirmeler olarak yürütülüyor). Bir şekilde hook_views_data () ile alt sorgu tanımlamak mümkün mü yoksa başka bir yaklaşım benim mi almam gerekiyor?

Herhangi bir tavsiye takdir!

Yanıtlar:


5

Daha ileriye baktım, ama bunu açıklayan herhangi bir belge bulamadım.

Ne gerek kullanıcılar için veri tutan diğer iki tablo ile kullanıcılar tabloya katılmak için bir yoluydu. Ancak, diğer iki tablo, kullanıcılar tablosuyla 'bire-çok' ilişkisi içerisindedir; bu, aynı zamanda bu tabloların her ikisiyle de kullanıcı tablosuna katılmaya çalışırsam Kartezyen bir birleşimle sonuçlanacağım anlamına gelir. . Ancak, tüm ihtiyacım olan herhangi bir kullanıcı ile ilişkili diğer iki tablodaki kayıt sayısını saymak olduğundan, bir alt sorgu hile yapmak gerekir. Ancak, Görünümler ve alt sorgular hakkında herhangi bir belge bulamadım - işte burada yaptım.

  1. İki kukla alan oluşturuldu

Hook_views_data () aracılığıyla iki kukla alan ('indirmeler' ve 'dinler' diyeceğim) oluşturdum. Alanın tanımı aşağıda listelenmiştir.

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',
      ),
    )
  ),
);

Artık kullanıcılar için bir görünüm yapılandırdığınızda, 'İndirilenler' ve 'Dinler' alanları görünecektir. Ancak, şimdi bir sorgu çalıştırmayı denemek, sonuçta kukla alanlar kukla alanlar olduğundan bir hataya neden olacaktır. Onlar yok. Bu alanların tek amacı hook_views_query_alter () uygulamamıza birkaç yedek parça yapması gerektiğini bildirmektir.

  1. Hook_views_query_alter () uygulayın

Buradaki hile, verilen sorgunun 'İndirilenler' veya 'Dinler' alanlarını içerip içermediğini kontrol etmektir. Varsa, alanları sorgudan kaldırır ve alt sorgularla değiştiririz. Bu işlevin uygulanması aşağıdaki gibidir.

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

Alt sorgu için kaldırılan alanın takma adını yeniden kullandığımızı unutmayın. Bu şekilde Views, alt sorgudan döndürülen değerin gerçekte kukla alandan geldiğini düşünür (sonuçta mevcut değildir).

Öyle. Kartezyen birleştirme almıyoruz ve hem 'indirmeler' hem de 'dinler' doğru sayılıyor.


4

Alt sorgu filtre değerlerine sahip olmak gerekene kadar sbrattla'nın çözümünü kullandım. Şimdi sayısı sorgusu gerçekleştiren ayrı bir görünüm katıştırmak için views_field_view modülünü kullanın. Ben filtre değerleri görünüm alanları (ve böylece belirteçleri) olarak kullanılabilir yapar views_filterfield modülü (ki ben yazdım) aracılığıyla bu katıştırılmış görünüme bağlam filtre değerleri iletebilirsiniz .

Sayım sorgusu artık çalışır ve ana sorgudaki açık filtreleri devralır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.