Jaki jest najbardziej zrównoważony sposób uzyskiwania zbiorczych informacji o polach?


12

EntityFieldQuery nie jest przeznaczony do uruchamiania funkcji agregujących (SUM, AVG itp.) Na danych polowych, ponieważ jest niezależny od SQL. To powiedziawszy, takie operacje muszą być okresowo uruchamiane. Zgodnie z funkcją SQL z EntityFieldQuery, a zwłaszcza EntityFieldQuery i tym, jak używać funkcji agregujących SUM, ARG i MAX , należy używać zapytań SQL, a takie podejście najlepiej pasuje do mojego przypadku użycia. Rozmawiałem wczoraj z @chx, a on zalecił użycie kilku wewnętrznych funkcji do znalezienia nazwy pola i nazwy kolumny. Zastanawiam się tylko, czy jest to zrównoważone i czy warto zrobić to w bazie kodu, którą mógłbym udostępnić innym.

Jeśli to najlepszy sposób, to najlepszy sposób. Po prostu nie chcę tego robić, dopóki nie jestem absolutnie pewien, ponieważ jest bałagan.


Na razie korzystałem właśnie z funkcji wewnętrznych ( _field_sql_storage_tablename($field)i _field_sql_storage_columnname($field_name, $column), które odpowiadają moim bieżącym potrzebom, ale nie są zrównoważone, więc nadal jestem zainteresowany odpowiedzią na to pytanie, jeśli takie będzie.
wizonesolutions

Odpowiedzi:


2

Zobacz pole Moduł pozwala wystawiać stoliki boiska w tabelach podstawowych poglądów. Różni się to od Wyświetleń domyślne zachowanie tym, że tabela bazowa jest tabela pole, a nie podmiot, którego dane pole jest następnie ładowane z. Na przykład, wybierając węzeł jako tabelę podstawową, możesz następnie dodać pola, ale podstawową (tabelą podstawową) w zapytaniu jest nadal węzeł, który w zależności od twoich danych może zepsuć funkcje agregujące (inaczej relacja jeden do jednego niektórych pola do węzła).

Pole Widoki umożliwia bezpośredni dostęp do tabel pól, co oznacza, że ​​funkcje agregujące działają poprawnie. Dodatkowo, jeśli potrzebujesz wykonać „ciekawe” połączenia z innymi tabelami pól, możesz je całkowicie kontrolować, wykonując następujące czynności.

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

Jest to dość prosty w użyciu i umożliwia wykonywanie funkcji agregujących w wielu tabelach pól jednocześnie. Następnie możesz ręcznie wywołać widok $view->execute()i wyciągnąć wyniki z widoku. Przykłady tego znajdują się w dokumentacji widoków.

Zaletą tego podejścia w porównaniu z EntityFieldQuery jest to, że możesz zarządzać procesem w Widoku (z którego prawie wszyscy już będą korzystać) i pozwolić mu na wykonanie fizycznego zapytania w mniej bezpośredni sposób, co pomaga w podniesieniu możliwego uszkodzenia na drodze. Ponadto wiele razy będziesz chciał wyświetlać takie dane zbiorcze na ekranie administratora, które następnie możesz użyć w widoku, aby zapewnić zarówno wyświetlanie, jak i dostęp do wyników w kodzie do dodatkowych celów.


Będę musiał to sprawdzić. Mógłbym zamienić ten kod na moje pola obliczeniowe zamiast wykonywać zapytanie ręcznie. Prawdopodobnie będę pracował nad witryną, w której będę tego wkrótce potrzebować i w pewnym momencie zdam raport. Jeśli to zadziała, zaakceptuję.
wizonesolutions

0

Czy można to zrobić w module dodatkowym do widoków? Bardzo dobrze radzi sobie z zapytaniami, a niektóre wyniki są publikowane z funkcjami agregującymi, na przykład w działaniach, w których zawodzą filtry kontekstowe, w których może domyślnie przyjmować wszystkie wartości i zliczać dostępne wyniki. Funkcje zapytań powinny tam być, ale potrzebny byłby do tego formularz interfejsu użytkownika. Daj mi znać, jeśli to ma sens. Właśnie zaczynam analizować poglądy i spekuluję.


COUNT zapytań można uruchamiać na jednostkach, więc zostało to rozwiązane. Sam jestem bardziej zainteresowany SUM. views_calc może zapewnić wgląd, ale chcę użyć wartości w polu obliczeniowym ... co mógłbym zrobić z views_get_view_result (lub podobnym). Jednak uzyskanie Widoku do wygenerowania tego zapytania w pierwszej kolejności to podstęp. Wygląda na to, że hackish sposób może być najlepszy. Chyba zacznę od tego, bo jeśli go nie wypuszczę, będę złoty. Jeśli to zrobię, mam nadzieję, że ktoś prześle łatkę.
wizonesolutions
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.