কেন ook GROUP BYery in hook_views_query_alter () কাজ করে না?


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, দফা সঠিকভাবে সক্রিয় করা হয় কিন্তু SQL কোয়েরি প্রভাবিত হয় না : দফা প্রদর্শিত হবে না:groupbyGROUP 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 যোগ না করে অপ্রয়োজনীয় গোষ্ঠীটি সরিয়ে ফেলতে পারি;
আরুন

আমি কয়েক ঘন্টা ডিবাগিং ভিউ গ্রুপ দ্বারা ব্যয় করেছি। তবে বর্তমানে আমি অন্যান্য সমাধান জানি না।
দুধভস্কি

আপনার মন্তব্যের জন্য ধন্যবাদ. হুম .. আমি জিজ্ঞাসা করছি কারণ, যদি আমরা যোগ করি $ ক্যোয়ারী-> স্বতন্ত্র = সত্য; তারপরে এটি nidগ্রুপের সাথে যুক্ত হবে । এটা আমার জন্য প্রয়োজন হয় না। অন্য কোন বিকল্প? আপনি কীভাবে ভিউ ক্যোয়ারিতে অনন্য যুক্ত করবেন জানেন?
আরুন

এটা দূরে ছিল views_handler_filter::query()। ব্যবহার করে দেখুন $query->distinct();এর মধ্যেhook_query_alter
milkovsky

1

পার্টিতে দেরীতে হলেও এটি অন্য কারও পক্ষে সহায়তা করতে পারে।

আমার ক্ষেত্রে আমি ট্যাক্সনমি টার্ম ক্ষেত্র ( https://drupal.org/node/1808320 ) সহ ব্যবহারকারীদের একটি অতিরিক্ত তালিকা (অতিরিক্ত মডিউল প্রোফাইল 2 ব্যবহার করে) সরবরাহ করছিলাম । আমি একাধিক ফলাফল দেখছিলাম যা আমি ভিউ 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(TABLE_NAME, FIELD, FIELD_ALIAS, array('function' => 'groupby'))

1

যদি আপনি এখনও ক্যোয়ারিতে যুক্ত হওয়া অপ্রয়োজনীয় GROUP বিবৃতির মুখোমুখি হন তবে আপনি এগুলিকে সরিয়ে ফেলতে পারেন 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

ক্ষেত্র যা আসলে এসকিউএল 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

আপনি যদি হুক_ভিউ_কোয়ারি_াল্টারের ডকুমেন্টেশন হিসাবে দেখেন তবে আমার বিশ্বাস কোয়েরিটি চালানোর জন্য ইতিমধ্যে প্রস্তুত। উদাহরণস্বরূপ, ডেটাবেস এপিআই দ্বারা প্রতিস্থাপন করা হয়েছে এবং এটি মাইএসকিউএলে তারের মাধ্যমে প্রেরণ করা হবে। হুক_ভিউ_কোয়ারি_াল্টার ব্যবহারের আর একটি উদাহরণ বিটিম্যাশ ব্লগ দেখা যায়

এটি হ'ল আপনার আর কোনও ডিবি ক্যোয়ারী অবজেক্ট নয় তবে অ্যারে হিসাবে এক্সপ্রেশন, ভেরিয়েবল ইত্যাদির সাথে এসকিউএল স্টেটমেন্টের টুকরো রয়েছে।

আমার সামনে আমার কাছে কোনও জিজ্ঞাসা নেই তবে নীচের অনির্ধারিত কোডের মতো কিছু যা আপনি চান:

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

আপনার উত্তরের জন্য ধন্যবাদ! আমি চেষ্টা করেছি কিন্তু এটি কাজ করে না: আবারও, $queryবস্তুটি পরিবর্তন করা হয়েছে (অবশ্যই উপরের অংশের চেয়ে আলাদা) তবে আবার এসকিউএল কোয়েরি পরিবর্তন হয় না!
জোজি

আপনি কি আলাদা ভিউ হুক চেষ্টা করেছেন? _প্রিয়_রেন্ডার, না _প্রেম বিল্ড? .... আমি হুক_ভিউ_প্রেম_এক্সেকিউট () ... api.drupal.org/api/views/views.api.php/function/…
টেনেন

0

এটি ভিউ_কিউরি_াল্টারে এভাবেই করা হয়; নোড_একসেস অংশটি প্রয়োজনীয় নয়।

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

আমি অবাক হয়েছি যে কেউই আসল সমাধান সরবরাহ করে না যা স্রেফ কার্যকর হয়। এখানে একটি পদ্ধতি রয়েছে যা আমি এখানে পেয়েছি , @ বি-রাবণবখশের জন্য অনেক ধন্যবাদ:

/**
 * 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

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');
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.