मैंने आगे देखा, लेकिन वास्तव में यह वर्णन करने वाला कोई भी दस्तावेज नहीं मिला।
मुझे जिन चीज़ों की ज़रूरत थी, वह उपयोगकर्ताओं के लिए डेटा रखने वाली दो अन्य तालिकाओं के साथ उपयोगकर्ताओं की तालिका में शामिल होने का एक तरीका था। हालांकि, दो अन्य तालिकाएं उपयोगकर्ता तालिका के साथ 'एक-से-कई' संबंध में हैं, जिसका अर्थ है कि मैं कार्टेशियन के साथ समाप्त हो जाऊंगा यदि मैं एक ही समय में इन दोनों तालिकाओं के साथ उपयोगकर्ता तालिका में शामिल होने का प्रयास करता हूं। । हालाँकि, चूंकि मुझे किसी भी उपयोगकर्ता के साथ जुड़े दो अन्य तालिकाओं में रिकॉर्ड की संख्या की गणना करने की आवश्यकता है, इसलिए एक सबक्वेरी को चाल करने में सक्षम होना चाहिए। हालाँकि, मैं दृश्य और उपश्रेणियों पर कोई दस्तावेज़ नहीं ढूँढ सका - इसलिए यहाँ मैंने क्या किया।
- दो डमी फ़ील्ड बनाए
मैंने हुक_व्यू_डेटा () के माध्यम से दो डमी फ़ील्ड (जिसे मैं 'डाउनलोड' और 'सुनता हूं') बनाया था। क्षेत्र की परिभाषा नीचे सूचीबद्ध है।
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',
),
)
),
);
अब, जब आप उपयोगकर्ताओं के लिए एक दृश्य कॉन्फ़िगर करते हैं, तो फ़ील्ड 'डाउनलोड' और 'लिस्टेंस' दिखाई देंगे। हालाँकि, अब एक क्वेरी चलाने का प्रयास करने के परिणामस्वरूप सभी डमी फ़ील्ड के बाद डमी फ़ील्ड के रूप में एक त्रुटि होगी। वे मौजूद नहीं हैं। इन क्षेत्रों का एकमात्र उद्देश्य हुक_ साक्षात्कार_क्लेरी_ल्टर () के हमारे कार्यान्वयन के लिए संकेत देना है कि इसे कुछ प्रतिस्थापन करने की आवश्यकता है।
- हुक_ साक्षात्कार_क्लेरी_ल्टर लागू करें ()
यहाँ दिए गए प्रश्न को हटाने के लिए ट्रिक में 'डाउनलोड' या 'लिस्टेंस' फ़ील्ड शामिल हैं। यदि ऐसा होता है, तो हम फ़ील्ड को क्वेरी से हटा देंगे और उन्हें सबक्वेरीज़ से बदल देंगे। इस फ़ंक्शन का कार्यान्वयन नीचे के रूप में होता है।
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;
}
}
}
}
ध्यान दें कि हम उप-क्षेत्र के लिए हटाए गए फ़ील्ड के उपनाम का पुनः उपयोग कर रहे हैं। इस तरह, व्यूज़ सोचेंगे कि वास्तव में सबक्वेरी से लौटाया गया मूल्य डमी क्षेत्र से आता है (जो सब मौजूद नहीं है)।
यानी कि। हम कार्टेसियन में शामिल नहीं हो रहे हैं और 'डाउनलोड' और 'सुने' दोनों को सही ढंग से गिना जाता है।