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