Korzystam z widoków 7.x-3.6 i próbowałem zmienić GROUP BY
klauzulę hook_views_query_alter()
w następujący sposób:
function mymodule_views_query_alter(&$view, &$query) {
if ($view->name == "view_name"){
$query->add_groupby('field_name');
dpm($query);
}
}
Kiedy patrzę w $query
, klauzula jest prawidłowo włączony ale kwerenda SQL nie ma wpływu : the klauzula nie pojawia się:groupby
GROUP BY
To, co ostatecznie zrobiłem, to użycie haka rdzeniowego Drupal ( hook_query_alter()
) i działało dobrze: SQL ma teraz wpływ.
function mymodule_query_alter(QueryAlterableInterface $query) {
$view_name = 'view_name';
if ($query->hasTag('views_' . $view_name)) {
$query->groupBy('field_name');
}
}
Czy jest jakiś powód, dla którego mój hook_views_query_alter()
nie działa? Zastanawiam się, czy jest na to czystszy sposób i.
nid
do grupy według. Nie jest to dla mnie konieczne. Jakaś inna opcja? Czy wiesz, jak dodać unikalne w zapytaniach widoki?views_handler_filter::query()
porządku. Spróbuj$query->distinct();
whook_query_alter
Późno na imprezę, ale może to pomóc komuś innemu.
W moim przypadku podałem listę użytkowników (używając dodatkowego modułu Profile2) z polem Taksonomia ( https://drupal.org/node/1808320 ). Widziałem wiele wyników, których nie mogłem się pozbyć za pośrednictwem interfejsu API Views 3.
W moim module niestandardowym dodałem:
Parametry dla pola add_field to
źródło
Jeśli nadal masz do czynienia z niepotrzebnymi instrukcjami GROUP BY dodanymi do zapytania, możesz je usunąć
hook_query_alter()
. Rozwiązałem problem z zamawianiem komentarzy na przykład przez większość komentowanych komentarzy rodziców.Więc
hook_views_query_alter()
mam:Wystąpił błąd związany z niemożnością grupowania według
pole, które jest faktycznie wynikiem
COUNT()
funkcji SQL .Skończyło się na tym:
źródło
Jeśli spojrzysz na dokumentację hook_views_query_alter , uważam, że zapytanie jest już przygotowane do uruchomienia. Np. Zastąpiono interfejs API bazy danych, który ma zostać przesłany przewodowo do MySQL. Innym przykładem użycia hook_views_query_alter jest blog BTMash .
W takim przypadku nie masz już obiektu zapytania DB, ale fragmenty instrukcji SQL z wyrażeniami, zmiennymi itp. Jako tablicą.
Nie mam przed sobą zapytania, ale chcesz czegoś takiego: następujący nieprzetestowany kod:
źródło
$query
obiekt został zmieniony (inaczej niż powyżej oczywiście), ale ponownie zapytanie SQL nie zmienia się!Tak to się robi w views_query_alter; część node_access nie jest konieczna.
źródło
Zastanawiałem się, że nikt nie przedstawił prawdziwego rozwiązania, które po prostu działa. Jest jedna taka metoda, którą tu znalazłem , wiele dzięki @ b-ravanbakhsh:
źródło
W Drupal 8 i dzięki podejściu graceman9 będzie to:
źródło