Как заставить работать add_groupby (views handler filter) ?

Главные вкладки

Комментарии

Аватар пользователя ilyin.eugene ilyin.eugene 16 мая 2012 в 6:51

> $this->query->add_field('', "$this->belts_table.field_united_parameter_value", $this->field_alias, array('aggregate' => TRUE));

Если вы хотите группировать по этому полю - то array('aggregate' => TRUE) здесь лишнее.

Аватар пользователя divined divined 16 мая 2012 в 12:30

Насколько я помню, разработчики views сказали что не имеют представления как сделать правильную группировку, поэтому до сих пор нету кода который бы в запрос добавлял это условие, хотя все АПИ для этого имеются. Я выходил из положения 2-мя способами:
В 6-ке писал свой запрос а с помощью views делал запрос к своему запросу )
В 7-ке Напрямую в хуке views_query редактировал результат запроса добавляя нужные строчки группировки.

Аватар пользователя ilyin.eugene ilyin.eugene 19 мая 2012 в 8:05

Странно. ну тут надо ковырять, смотреть что откуда приходит - так дистанционно сложно понять почему так происходит.

Аватар пользователя luciuz VII luciuz VII 22 мая 2012 в 14:43

http://drupalcontrib.org/api/drupal/contributions%21views%21plugins%21vi...

/**
   * Generate a query and a countquery from all of the information supplied
   * to the object.
   *
   * @param $get_count
   *   Provide a countquery if this is true, otherwise provide a normal query.
   */

  function query($get_count = FALSE) {
    // Check query distinct value.
    if (empty($this->no_distinct) && $this->distinct && !empty($this->fields)) {
      if ($this->pure_distinct === FALSE){
        $base_field_alias = $this->add_field($this->base_table, $this->base_field);
        $this->add_groupby($base_field_alias);
      }
      $distinct = TRUE;
    }

разве?

Аватар пользователя divined divined 22 мая 2012 в 15:19
<?php
    $query
->addMetaData('views_substitutions'module_invoke_all('views_query_substitutions'$this));
    
drupal_set_message('<pre>'.print_r($query,1).'</pre>');
    return 
$query;
?>
Аватар пользователя ser_house ser_house 5 июня 2012 в 17:35

Из своего кода (для поля ноды, хранит ссылки на файлы):

  function query() {
    $this->ensure_my_table();
    $sid_field_name = $this->definition['field_name'] . '_sid';

    //Добавляем сайты для группировки
    $this->query->add_field($this->table_alias, $sid_field_name, '', array('function' => 'groupby'));
   
    //Добавляем группировку по сайтам
    $this->query->add_groupby($sid_field_name);
   
    //Одна нода - один размер
    $this->query->options['distinct'] = TRUE;
  }

$this->definition['field_name'] - сюда я в hook_field_views_data сохранил имя поля.

Строго говоря, это из потомка класса views_handler_field, а не views_handler_filter, но мне думается, суть такая же.

Аватар пользователя luciuz VII luciuz VII 6 июня 2012 в 22:21

Спасибо.
стало лучше -- теперь группировка по двум полям
GROUP BY field_data_field_united_parameter.field_united_parameter_value, nid

вот бы по nid убрать

Аватар пользователя luciuz VII luciuz VII 6 июня 2012 в 23:05

вот код united_product_handler_filter_mycustomfilter2.inc

<?php

/**
 * My custom filter handler
 */
class united_product_handler_filter_mycustomfilter2 extends views_handler_filter {

  function 

query() {
       
$this->ensure_my_table();
    
    
$field_alias 'united_parameter';
    
    
$join = new views_join();
    
$join->construct('field_data_field_united_parameter'$this->table_alias'nid''entity_id', array(), 'INNER');
    
$this->query->ensure_table('field_data_field_united_parameter'$this->relationship$join);
    
    
$this->query->add_field('field_data_field_united_parameter'"field_united_parameter_value",
    
$field_alias, array('function' => 'groupby'));
    
    
$this->query->add_groupby('field_data_field_united_parameter.field_united_parameter_value');

    

$this->query->options['distinct'] = TRUE;

}

}

?>

генерирует нам запрос

SELECT DISTINCT node.created AS node_created, node.nid AS nid
FROM
{node} node
INNER JOIN {field_data_field_united_parameter} field_data_field_united_parameter ON node.nid = field_data_field_united_parameter.entity_id
WHERE (( (node.status = '1') ))
GROUP BY field_data_field_united_parameter.field_united_parameter_value, nid
ORDER BY node_created DESC
Аватар пользователя luciuz VII luciuz VII 11 июня 2012 в 16:44

как я понял, если используешь агрегацию, то все поля которые добавляешь в Поля и поля, которые добавляешь в сортировку, добавляются в GROUP BY.
В моем случае, это поле nid, так как вместо полей у меня Анонсы.

Разве нет способа так изменить объект query, чтобы поля nid не было в GROUP BY?
Или же костыльно изменить уже сам запрос?

Аватар пользователя milkovsky milkovsky 31 октября 2013 в 16:38

Убрал nid с помощью

<?php
$this
->query->pure_distinct TRUE;
?>

но остальные поля убрать не получается.

Вот мой код:

<?php
$this
->ensure_my_table();
$alias $this->table_alias;

$this->query->distinct TRUE;
$this->query->pure_distinct TRUE;
?>

...

<?php
$this
->query->add_field($alias'nid''node_nid', array('function' => 'groupby'));
$this->query->add_groupby($alias '.nid');
?>

...

<?php
$this
->query->add_field(NULL'SUM(' $aul_user_table '.grant_view)''grant_view', array());
$this->query->add_field(NULL'SUM(' $aul_user_table '.grant_update)''grant_update', array());
$this->query->add_field(NULL'SUM(' $aul_user_table '.grant_delete)''grant_delete', array());
?>

Формирует запрос с:
GROUP BY node.nid, grant_view, grant_update, grant_delete

Аватар пользователя milkovsky milkovsky 31 октября 2013 в 17:28

Решил.
Если кто-то столкнется, вот как нужно правильно добавлять SUM чтобы избежать GROUP BY ненужных полей:

<?php 
    $this
->query->add_field($aul_user_table'grant_view''grant_view', array('function' => 'sum'));
    
$this->query->add_field($aul_user_table'grant_update''grant_update', array('function' => 'sum'));
    
$this->query->add_field($aul_user_table'grant_delete''grant_delete', array('function' => 'sum'));
?>