हुक_ साक्षात्कार_क्लेरी_ल्टर () में `ग्रुप BY` क्यों काम नहीं करता है?


11

मैं व्यूज़ 7.x-3.6 का उपयोग कर रहा हूं और मैंने नीचे के GROUP BYसाथ क्लॉज को बदलने की कोशिश की है hook_views_query_alter():

function mymodule_views_query_alter(&$view, &$query) {
    if ($view->name == "view_name"){
      $query->add_groupby('field_name');
      dpm($query);    
    }
}

जब मैं अंदर देखता हूं $query, तो groupbyक्लॉज सही रूप से सक्षम है लेकिन SQL क्वेरी प्रभावित नहीं होती है : GROUP BYक्लॉज दिखाई नहीं देता है:

यहाँ छवि विवरण दर्ज करें

मैंने आखिरकार ड्रुपल कोर हुक ( hook_query_alter()) का उपयोग किया है और यह ठीक काम कर रहा है: एसक्यूएल अब प्रभावित हुआ है।

function mymodule_query_alter(QueryAlterableInterface $query) {
  $view_name = 'view_name';
  if ($query->hasTag('views_' . $view_name)) {    
    $query->groupBy('field_name');
  }
}

मेरे hook_views_query_alter()काम करने का कोई कारण नहीं? मैं सोच रहा था कि क्या यह करने के लिए एक क्लीनर तरीका है और।

जवाबों:


11

पैरामीटर के add_field()साथ उपयोग करें array('function' => 'groupby')

$query->add_field('node', 'nid', 'node_nid', array('function' => 'groupby'));
$query->add_groupby('node.nid');

सशर्त जानकारी:

उपयोग करने के बाद add_groupbyआप अगला कोड देख सकते हैं GROUP BY:

GROUP BY node.nid, nid

अगला अंक देखें: https://drupal.org/node/1578808

अनावश्यक समूह से बचने के लिए शर्तों में जोड़ें:

$query->distinct = TRUE;

1
हम $ क्वेरी को जोड़कर बिना आवश्यक समूह को कैसे हटा सकते हैं-> अलग = TRUE;
ARUN

मैंने कुछ घंटे डिबगिंग व्यू ग्रुप द्वारा बिताए। लेकिन वर्तमान में मैं अन्य समाधान नहीं जानता।
दूधोवस्की

आपके कमेंट के लिए धन्यवाद। हम्म .. मैं पूछ रहा हूँ क्योंकि, अगर हम $ क्वेरी जोड़ते हैं-> अलग = TRUE; तो यह nidसमूह के साथ जोड़ देगा । यह मेरे लिए जरूरी नहीं है। कोई अन्य विकल्प? क्या आप जानते हैं कि दृश्य क्वेरी में अद्वितीय कैसे जोड़ा जाए?
ARUN

यह views_handler_filter::query()अफेयर था । प्रयास करें $query->distinct();मेंhook_query_alter
milkovsky

1

पार्टी के लिए देर से लेकिन यह किसी और की मदद कर सकता है।

मेरे मामले में मैं एक वर्गीकरण अवधि ( https://drupal.org/node/1808320 ) के साथ उपयोगकर्ताओं (अतिरिक्त मॉड्यूल Profile2 का उपयोग करके) की एक सूची प्रदान कर रहा था । मैं कई परिणामों को देख रहा था जिन्हें मैं व्यू 3 एपीआई के माध्यम से छुटकारा नहीं दे सकता था।

अपने कस्टम मॉड्यूल में मैंने जोड़ा:

/**
    Implementation of hook_views_query_alter()
**/
function MYMODULE_views_query_alter(&$view, &$query) {

  if($view->name == "provider_results_list" && $view->current_display == "page_1") {

    $query->distinct = TRUE;

    // User the provider uid to make the results distinct: using a taxonomy field for
    // keyword searches brings up multiple results. 
    $query->add_field('profile', 'uid', 'provider_uid', array('function' => 'groupby'));

  }
}

Add_field के पैरामीटर हैं

add_field(TABLE_NAME, FIELD, FIELD_ALIAS, array('function' => 'groupby'))

1

यदि आप अभी भी अनावश्यक समूह के साथ सामना कर रहे हैं, तो क्वेरी में जोड़े गए बयानों से आप उन्हें हटा सकते हैं hook_query_alter()। मैंने उदाहरण के लिए अधिकांश टिप्पणी वाले मूल टिप्पणियों द्वारा टिप्पणियों का आदेश देने के साथ समस्या को हल किया।

तो hook_views_query_alter()मेरे पास है:

/**
 * Implements hook_views_query_alter().
 */
function MODULENAME_views_query_alter(&$view, &$query) {
  if ($view->name == 'reviews' && $query->orderby[0]['field'] == 'comment_thread') {
    $join = new views_join;
    $join->construct('comment', 'comment', 'cid', 'pid', NULL, 'LEFT');
    $query->add_relationship('c1', $join, 'comment');
    $query->add_field('comment', 'pid', 'c1_pid', array('function' => 'groupby'));
    $query->add_groupby('c1.pid');
    $query->add_orderby(NULL, 'COUNT(c1.cid)', 'DESC', 'comments_count');
    $query->distinct = TRUE;
    $query->orderby[0] = $query->orderby[count($query->orderby) - 1];
    unset($query->orderby[count($query->orderby) - 1]);
  }
}

मुझे समूह द्वारा अक्षमता से संबंधित त्रुटि मिली

comments_count

फ़ील्ड जो वास्तव में SQL COUNT()फ़ंक्शन का परिणाम है ।

मैंने इसे समाप्त किया:

/**
 * Implements hook_query_alter().
 */
function MODULENAME_query_alter(QueryAlterableInterface $query) {
  if (isset($query->alterMetaData['view']->name) && $query->alterMetaData['view']->name == 'reviews') {
    $fields =& $query->getGroupBy();
    foreach (array_keys($fields) as $key) {
      // Remove group by statements from generated query which were actually not set in view query.
      if (!in_array($key, $query->alterMetaData['view']->query->groupby)) {
        unset($fields[$key]);
      }
    }
  }
}

0

यदि आप देखते हैं कि हुक_ साक्षात्कार_क्वारी_लेखक के दस्तावेज हैं , तो मेरा मानना ​​है कि क्वेरी पहले से ही चलाने के लिए तैयार है। उदाहरण के लिए, डेटाबेस API द्वारा प्रतिस्थापन किए गए हैं और इसके बारे में MySQL के तार पर भेजा जाना है। हुक_ साक्षात्कार_क्लेरी_ल्टर उपयोग का एक और उदाहरण BTMash ब्लॉग देखा जा सकता है

यह मामला होने के नाते अब आपके पास डीबी क्वेरी ऑब्जेक्ट नहीं है, लेकिन एरो के रूप में एक्सप्रेशन, वेरिएबल्स आदि के साथ एसक्यूएल स्टेटमेंट के टुकड़े हैं।

मेरे सामने मेरे पास कोई प्रश्न नहीं है, लेकिन निम्नलिखित अनुपयोगी कोड जैसा कुछ आप चाहते हैं:

$query->groupby[0]['field'] = 'field_name';

आपके उत्तर के लिए धन्यवाद! मैंने कोशिश की लेकिन यह या तो काम नहीं करता है: फिर से, $queryवस्तु को बदल दिया जाता है (पाठ्यक्रम के ऊपर से अलग) लेकिन फिर से, SQL क्वेरी नहीं बदलती है!
जोजी

क्या तुमने एक अलग विचार हुक की कोशिश की? _pre_render, या _pre_build? .... मैं hook_views_pre_execute () ... api.drupal.org/api/views/views.api.php/function/…
दस

0

यह जिस तरह से view_query_alter में किया जाता है; नोड_सक्सेस भाग आवश्यक नहीं है।

function xdas_target_audience_views_query_alter(&$view, &$query) {
  $controlled_views = variable_get('xdas_target_audience_views', array(
    'landing_products',
    'promotions',
    'landing_coupons',
    'landing_coupons_belvita',
    'landing_coupons_lulu',
    'related_coupon',
    'cuponazo',
    'banner',
    'brands',
  ));
  if (in_array($view->name, $controlled_views) && $view->base_table == 'node') {
    //add node_access to views so we can control access.
    $query->add_tag('node_access');
    $join = new views_join();
    $join->construct('xdas_target_audience_boost', 'node', 'nid', 'nid');        
    $query->add_relationship('xdas_target_audience_boost', $join, 'node');
    $query->add_field('xdas_target_audience_boost', 'score', 'score' , array('function' => 'max'));
    $query->add_orderby(NULL, NULL, 'DESC', 'score');   
    $query->add_groupby('nid');    
  }
}

0

मुझे आश्चर्य है कि किसी ने भी एक वास्तविक समाधान प्रदान नहीं किया जो बस काम करता है। इस तरह की एक विधि है जो मुझे यहाँ मिली है , @ b-ravanbakhsh को बहुत धन्यवाद:

/**
 * Implements hook_query_alter().
 */
function MODULENAME_query_alter(QueryAlterableInterface $query) {
  if (isset($query->alterMetaData['view'])) {
    if($query->alterMetaData['view']->name == 'YOUR_VIEW_NAME'){
      // also you can unset other group by critera by using, unset($query->getGroupBy());
      $query->groupBy('users.uid');
    }
  }
}

0

Drupal 8 में और ग्रेसमैन 9 दृष्टिकोण के लिए धन्यवाद, यह होगा:

use Drupal\Core\Database\Query\AlterableInterface;

function MYMODULE_query_alter(AlterableInterface $query) {
  if (isset($query->alterMetaData['view'])) {
    if($query->alterMetaData['view']->id() == 'replace_by_view_machine_name') {
      // Group by UID to remove duplicates from View results
      $query->groupBy('users_field_data.uid');
      // If multilingual site, you should add the following
      // $query->groupBy('users_field_data.langcode');
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.