Ich verwende Views 7.x-3.6 und habe versucht, die GROUP BY
Klausel hook_views_query_alter()
wie folgt zu ändern :
function mymodule_views_query_alter(&$view, &$query) {
if ($view->name == "view_name"){
$query->add_groupby('field_name');
dpm($query);
}
}
Wenn ich nachschaue $query
, ist die groupby
Klausel korrekt aktiviert, aber die SQL-Abfrage ist nicht betroffen : Die GROUP BY
Klausel wird nicht angezeigt:
Was ich schließlich getan habe, ist die Verwendung eines Drupal-Core-Hooks ( hook_query_alter()
) und es hat gut funktioniert: Das SQL ist jetzt betroffen.
function mymodule_query_alter(QueryAlterableInterface $query) {
$view_name = 'view_name';
if ($query->hasTag('views_' . $view_name)) {
$query->groupBy('field_name');
}
}
Gibt es einen Grund, warum mein hook_views_query_alter()
nicht funktioniert? Ich frage mich, ob es einen saubereren Weg gibt und.
nid
mit group by hinzugefügt . Es ist für mich nicht notwendig. Irgendeine andere Option? Wissen Sie, wie Sie eine eindeutige Abfrage in Ansichten hinzufügen können?views_handler_filter::query()
fair. Versuchen Sie$query->distinct();
inhook_query_alter
Spät zur Party, aber das könnte jemand anderem helfen.
In meinem Fall habe ich eine Liste der Benutzer (unter Verwendung des zusätzlichen Moduls Profile2) mit einem Feld für den Taxonomiebegriff ( https://drupal.org/node/1808320 ) bereitgestellt . Ich habe mehrere Ergebnisse gesehen, die ich über die Views 3-API nicht entfernen konnte.
In meinem benutzerdefinierten Modul habe ich hinzugefügt:
Die Parameter für add_field sind
quelle
Wenn Sie immer noch mit unnötigen GROUP BY-Anweisungen konfrontiert sind, die der Abfrage hinzugefügt wurden, können Sie diese entfernen
hook_query_alter()
. Ich habe das Problem gelöst, indem ich beispielsweise Kommentare von den meisten kommentierten Elternkommentaren bestellt habe.Also in habe
hook_views_query_alter()
ich:Ich habe einen Fehler im Zusammenhang mit der Unfähigkeit, nach zu gruppieren
Feld, das tatsächlich ein Ergebnis der SQL-
COUNT()
Funktion ist.Am Ende hatte ich Folgendes:
quelle
Wenn Sie sich die Dokumentation von hook_views_query_alter ansehen , ist die Abfrage meines Erachtens bereits für die Ausführung vorbereitet. Beispielsweise wurden Ersetzungen durch die Datenbank-API vorgenommen und werden bald über die Leitung an MySQL gesendet. Ein weiteres Beispiel für die Verwendung von hook_views_query_alter ist der BTMash-Blog .
In diesem Fall haben Sie kein DB-Abfrageobjekt mehr, sondern die Teile der SQL-Anweisung mit Ausdrücken, Variablen usw. als Array.
Ich habe keine Abfrage vor mir, aber so etwas wie der folgende ungetestete Code ist das, was Sie wollen:
quelle
$query
Objekt geändert (natürlich anders als oben), aber auch hier ändert sich die SQL-Abfrage nicht!So wird es in views_query_alter gemacht; Der Teil node_access ist nicht erforderlich.
quelle
Ich fragte mich, dass niemand eine echte Lösung lieferte, die einfach funktioniert. Es gibt eine solche Methode, die ich hier gefunden habe , vielen Dank an @ b-ravanbakhsh:
quelle
In Drupal 8 und dank graceman9 Ansatz wird es sein:
quelle