Насколько я помню, разработчики views сказали что не имеют представления как сделать правильную группировку, поэтому до сих пор нету кода который бы в запрос добавлял это условие, хотя все АПИ для этого имеются. Я выходил из положения 2-мя способами:
В 6-ке писал свой запрос а с помощью views делал запрос к своему запросу )
В 7-ке Напрямую в хуке views_query редактировал результат запроса добавляя нужные строчки группировки.
/**
* 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; }
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
как я понял, если используешь агрегацию, то все поля которые добавляешь в Поля и поля, которые добавляешь в сортировку, добавляются в GROUP BY.
В моем случае, это поле nid, так как вместо полей у меня Анонсы.
Разве нет способа так изменить объект query, чтобы поля nid не было в GROUP BY?
Или же костыльно изменить уже сам запрос?
Комментарии
але
heeelp
[здесь был неправильный код]
UP
Хендлер вообще появляется в списке?
все появляется.
в запросе даже есть правильный джойн
но нету GROUP BY
> $this->query->add_field('', "$this->belts_table.field_united_parameter_value", $this->field_alias, array('aggregate' => TRUE));
Если вы хотите группировать по этому полю - то array('aggregate' => TRUE) здесь лишнее.
я уже немного продвинулся в решении этого вопроса d.org
осталось только убрать ненужные поля из GROUP BY
array('aggregate' => TRUE) нужно для тех полей которые не нужны в группировке
а как? они не нужны для node.nid И node.created но их вообще нет в $this->query
Насколько я помню, разработчики views сказали что не имеют представления как сделать правильную группировку, поэтому до сих пор нету кода который бы в запрос добавлял это условие, хотя все АПИ для этого имеются. Я выходил из положения 2-мя способами:
В 6-ке писал свой запрос а с помощью views делал запрос к своему запросу )
В 7-ке Напрямую в хуке views_query редактировал результат запроса добавляя нужные строчки группировки.
Попробуйте добавить в query()
<?php
if ($this->view->query->fields['created']) {
$this->view->query->fields['created']['aggregate'] = TRUE;
}
?>
ilyin.eugene, там нету этих полей =\
$this->view->query вообще тут есть какие нибудь поля?
вот (отредактировано)
403 ошибка
перезалил
только эти 2 филда что на картинке?
ага
Странно. ну тут надо ковырять, смотреть что откуда приходит - так дистанционно сложно понять почему так происходит.
ну да, кто-нить знает где находится построитель запросов в views 3?
Я думал вы не спросите уже
plugins/views_plugin_query_default.inc
function query
а дальше?
мне бы хотелось знать, где именно запрос формируется, а не объект
Результатом работы данной функции как раз и будет текстовая стока - запрос.
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;
}
разве?
<?php
$query->addMetaData('views_substitutions', module_invoke_all('views_query_substitutions', $this));
drupal_set_message('<pre>'.print_r($query,1).'</pre>');
return $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, но мне думается, суть такая же.
Спасибо.
стало лучше -- теперь группировка по двум полям
GROUP BY field_data_field_united_parameter.field_united_parameter_value, nid
вот бы по nid убрать
Так а де он добавляется? Весь код можно глянуть?
вот код united_product_handler_filter_mycustomfilter2.inc
<?php /**
$this->query->options['distinct'] = TRUE;
* 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');
}
}
?>генерирует нам запрос
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
По-мойму, это где-то настройках добавляется.
эх, найти не смог, возможности изменить sql запрос через pre_execute, как было в drupal 6, здесь нету
как я понял, если используешь агрегацию, то все поля которые добавляешь в Поля и поля, которые добавляешь в сортировку, добавляются в GROUP BY.
В моем случае, это поле nid, так как вместо полей у меня Анонсы.
Разве нет способа так изменить объект query, чтобы поля nid не было в GROUP BY?
Или же костыльно изменить уже сам запрос?
Задача-то какая? Может, всё по-другому решается?
+1 у меня тоже эта проблема https://drupal.org/node/1578808#comment-8010961
Убрал 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
Решил.
Если кто-то столкнется, вот как нужно правильно добавлять 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'));
?>