Was ist der nachhaltigste Weg, um aggregierte Informationen zu Feldern zu erhalten?


12

EntityFieldQuery ist nicht zum Ausführen von Aggregatfunktionen (SUM, AVG usw.) für Felddaten vorgesehen, da es SQL-unabhängig ist. Das heißt, solche Operationen müssen von Zeit zu Zeit durchgeführt werden. Entsprechend der SQL-Funktion mit EntityFieldQuery und insbesondere EntityFieldQuery und der Verwendung der Aggregatfunktionen SUM, ARG und MAX müssen SQL-Abfragen verwendet werden, und dieser Ansatz passt am besten zu meinem Anwendungsfall. Ich habe gestern mit @chx gesprochen und er hat empfohlen, einige interne Funktionen zu verwenden, um den Feldnamen und den Spaltennamen zu finden. Ich frage mich nur, ob dies nachhaltig ist und ob es angebracht ist, dies in einer Codebasis zu tun, die ich möglicherweise für andere herausbringe.

Wenn es der beste Weg ist, dann ist es der beste Weg. Ich möchte es einfach nicht tun, bevor ich mir absolut sicher bin, weil es sich chaotisch anfühlt.


Im Moment habe ich nur die internen Funktionen ( _field_sql_storage_tablename($field)und _field_sql_storage_columnname($field_name, $column) verwendet, die meinen aktuellen Anforderungen entsprechen, aber sie sind nicht nachhaltig. Deshalb bin ich immer noch an einer Antwort auf diese Frage interessiert, falls eine kommen sollte.
Wizonesolutions

Antworten:


2

Das Sichtfeld - Modul ermöglicht es Ihnen , Feld Tabellen Basistabellen Ansichten zu belichten. Dies unterscheidet sich vom Standardverhalten von Views darin, dass die Basistabelle die Feldtabelle und keine Entität ist, aus der die Felddaten dann geladen werden. Wenn Sie beispielsweise einen Knoten als Basistabelle auswählen, können Sie Felder hinzufügen, aber die primäre (Basistabelle) in der Abfrage ist immer noch ein Knoten, der abhängig von Ihren Daten die Aggregatfunktionen vermasseln kann (auch bekannt als eine Viele-zu-Eins-Beziehung von einigen) Felder zum Knoten).

Mit dem Feld Ansichten können Sie direkt auf die Feldtabellen zugreifen, sodass Aggregatfunktionen ordnungsgemäß funktionieren. Wenn Sie außerdem "interessante" Verknüpfungen mit anderen Feldtabellen ausführen müssen, können Sie diese mithilfe der folgenden Funktionen vollständig steuern.

/**
 * Implements hook_views_data_alter().
 */
function mymodule_views_data_alter(&$data) {
  views_field_add_multi_join($data, /* see docs */);
}

Dies ist recht einfach zu verwenden und ermöglicht es Ihnen, Aggregatfunktionen über mehrere Feldtabellen gleichzeitig auszuführen. Sie können dann manuell eine Ansicht aufrufen $view->execute()und die Ergebnisse aus der Ansicht ziehen. Beispiele hierfür finden Sie in der View-Dokumentation.

Der Vorteil dieses Ansatzes gegenüber EntityFieldQuery besteht darin, dass Sie den Prozess in Ansichten (die von fast allen bereits verwendet werden) verwalten und die Erstellung physischer Abfragen auf weniger direkte Weise durchführen können. Außerdem möchten Sie häufig solche aggregierten Daten auf einem Administratorbildschirm anzeigen, auf dem Sie in der Ansicht sowohl eine Anzeige bereitstellen als auch für zusätzliche Zwecke auf die Ergebnisse im Code zugreifen können.


Ich muss das überprüfen. Ich könnte diesen Code in meine berechneten Felder tauschen, anstatt die Abfrage manuell durchzuführen. Ich werde wahrscheinlich an der Stelle arbeiten, wo ich das bald brauche und werde irgendwann darüber berichten. Wenn es klappt, nehme ich an.
Wizonesolutions

0

Könnte dies in einem Zusatzmodul zu Views gemacht werden? Es verarbeitet Abfragen sehr gut und einige Ergebnisse werden mit Aggregatfunktionen veröffentlicht, z. B. in Aktionen, bei denen Kontextfilter fehlschlagen. Dabei können standardmäßig alle Werte verwendet und die jeweils verfügbaren Ergebnisse berücksichtigt werden. Die Funktionen für die Abfragen sollten vorhanden sein, es wird jedoch ein UI-Formular benötigt. Lassen Sie mich wissen, ob dies sinnvoll ist. Ich beginne gerade, Ansichten zu zerlegen und spekuliere.


COUNT Abfragen können für Entitäten ausgeführt werden, das ist also gelöst. Ich interessiere mich mehr für SUM. views_calc liefert vielleicht einen Einblick, aber ich möchte den Wert in einem berechneten Feld verwenden ... was ich gut mit views_get_view_result (oder ähnlichem) machen könnte. Es ist jedoch der Trick, Views überhaupt dazu zu bringen, diese Abfrage zu generieren. Es scheint, als wäre der hackige Weg der beste. Ich denke, ich werde damit anfangen, denn wenn ich es nicht freigebe, werde ich golden sein. Wenn ich das tue, wird hoffentlich jemand einen Patch einreichen.
Wizonesolutions
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.