Zaawansowane filtrowanie Symfony + Doctrine |
Zaawansowane filtrowanie Symfony + Doctrine |
19.04.2021, 18:55:31
Post
#1
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
A napiszę coś może ciekawszego niż pytania o BOM, czy headers already sent
Opis tego co chciałbym uzyskać opiszę w skali micro. Musi to mieć przełożenie na skalę macro. Mamy sobie stronę z raportem. Raport dotyczy użytkowników (bazowa tabela) Muszę teraz dodać do tego filtrowanie - prościzna Jest sobie N filtrów po których mogę filtrować userów. Na cele demonstracyjne przyjmiemy: - filtrowanie po statusie użytkowania (tabela users) - filtrowanie po zamówieniach np. użytkownicy mający zamówienia w statusie pedding (tabela orders) - filtrowanie po produktach z zamówieć np: użytkownicy którzy zamówili zestaw X (tabela order_positions) - filtrowanie po adresach użytkowników (tabela user_adresses) Jak widać do każdego niemal filtra potrzebny jest LEFT JOIN z tabelką + odpowiedni WHERE Muszę zbudować w miarę przyjazne rozwiązanie które pozwoli mi zdefiniować Criteria filtrów które będą miały w sobie JOIN + CONDITIONS. Problemy które widzę to: - Kolejność JOIN ma znaczenie (chyba oczowiste) - Każde Criteria musi zawierać pełny zestaw danych typu JOIN i WHERE - Podczas aplikowania wielu Criterias JOIN muszą być odfiltrowane i wrzucone w odpowiedniej kolejności (jak określić wagę...) - i pewnie wiele innych Generalnie idealne rozwiązanie byłoby zrobić Kod new CriteriaCollection([ new OrderStatusCriteria(...), new OrderProductSthCriteria(...), ])->applyOn($qb) To taka rozkmina. Ma ktoś jakieś koncepcje albo rozwiązania? Zapraszam doo dyskusji PS. Inną metodą byłoby zbudowanie Grafu gdzie Vertex jest tabelą a Edge jest relacją między Vertexami. Przy robieniu A - C wybirać wszystko i skleić w kolejności w jakiej algo wyszuka ścieżkę (nie musi to być A - B - C ale może być A - D - E - C) |
|
|
24.05.2021, 07:51:51
Post
#2
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) |
Wydaje mi się, że to co napisał LowiczakPL ma sens ze względu na to, że od razu widać czego dotyczy filtrowanie. Ja pokusiłbym się o modyfikację tego rozwiązania, polegającą na utworzeniu interface-u definiującego zachowanie filtra. Wtedy miałbyś możliwość wstawienia nazwy klasy i wywoływania z niej metody buildQuery(), która mogłaby zwracać odpowiednie zapytanie filtrujące a nawet obiekt QueryBuilder, z którym możesz dalej robić co chcesz. Widziałem już coś na kształt rozwiązania LowiczakPL to w tym przypadku może dojść do sytuacji, plik zbiorczy znacznie się rozrośnie, więc tutaj popatrzyłbym na pojedynczy filtr jako obiekt, który byłby dołączany do kolejki filtrowania.
Ten post edytował emillo91 24.05.2021, 08:01:15 |
|
|
Wersja Lo-Fi | Aktualny czas: 9.05.2024 - 13:13 |