Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zaawansowane filtrowanie Symfony + Doctrine
Pyton_000
post
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 (IMG:style_emoticons/default/smile.gif)

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 (IMG:style_emoticons/default/smile.gif)

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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
LowiczakPL
post
Post #2





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

Ostrzeżenie: (0%)
-----


Na potrzeby automatycznego generowania datatables z zaawansowanymi filtrami i wyszukiwarką napisałem system.

Wykorzystałem traits jednak wystarczył mi 1 wykorzystujący Query Bulidera dołączany jest w konkretnych repozytoriach, które korzystają z tego filtrowania.

Do tego jest abstrakcja dodawana do serwisu który wykorzystuje filtrowanie.

A w samym serwisie filtry definiowane są w tablicy.

Tabela datatables oraz filtry i wyszukiwarki generowane są automatycznie na podstawie tablicy.

  1. /**
  2.   * @return array[]
  3.   */
  4. public function dataTableVariables(): array
  5. {
  6. return [
  7. 'service_date' => [
  8. 'title' => 'Data:godz.',
  9. 'type' => self::TYPE_SHOW_VALUE_BY_GETTER_NAME,
  10. 'isSearchable' => false,
  11. 'isOrdered' => true,
  12. 'isDateTimeField' => true,
  13. 'dateFormat' => 'Y-m-d H:i',
  14. 'valueName' => 'service_date',
  15. 'getterName' => 'serviceDate',
  16. 'className' => 'text-center',
  17. ],
  18. 'container_type' => [
  19. 'title' => 'Kontener',
  20. 'type' => self::TYPE_SHOW_VALUE_BY_MULTIPLE_GETTER_NAME,
  21. 'isSearchable' => true,
  22. 'isOrdered' => true,
  23. 'valueName' => 'container_type',
  24. 'getterNames' => ['conSize->name', 'conType->name'],
  25. 'separator' => ' ',
  26. 'className' => 'text-center',
  27. ], ...


Ten post edytował LowiczakPL 20.04.2021, 21:42:39
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 06:06