Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] MVC i olbrzymie zapytania
Forum PHP.pl > Forum > Przedszkole
in5ane
Cześć. Mam pytanie. Tworzę w modelu zapytanie i samo zapytanie jest wmiarę krótki (kilka linijek kodu). Ale gdy muszę już wyfiltrować dane, to dochodzi ogromna ilość warunków WHERE. W jaki sposób dodawać warunki do zapytania? Czy w kontrolerze już stworzyć odpowiednią regułę WHERE czy w modelu? Czy w tej samej metodzie, co mam to główne zapytanie? Na tą chwilę do tej metody z głównym zapytaniem przesyłam tablicę $params, która zawiera odpowiednie wartości, dla których muszę utworzyć WHERE i HAVING. Jak Wy to rozwiązujecie?
aniolekx
Raczej odpowiednie metody powinny istnieć w modelu, a twój opis problemu jest zbyt lakoniczny, potrzebny jest przykład i podaj także z czego korzystasz.
in5ane
Korzystam z Kohany, ale zapytanie jest na tyle długie i skomplikowane, że nie korzystam z ORM w tym przypadku.

Mam jedną metodę w modelu, która ma całe to długie zapytanie (SELECT FROM JOINY WHERE HAVING ORDER LIMIT). I z kontrolera przesyłam do tej metody tablicę $params, która wygląda np. tak:
  1. $params['category'] = 1;
  2. $params['availability'] = 2;
  3. // itd... jest tego dużo
I moje pytanie brzmi, czy w tej metodzie z tym długim zapytaniem powinienem sobie operować na tej tablicy i tworzyć sobie ten cały wielki WHERE, czy przerzucić to do innej metody. Ponadto w jaki sposób najładniej to zrobić? Mysłałem, by robić to tak np.:
  1. $where['category'] = 'c.id = ' . $params['category'];
  2. $where['availability'] = 'a.id = ' . $params['availability'];
  3. //itd...
Jakieś pomysły?

@edit: Aha i co w przypadku, gdy dany parametr mógłby być pusty. Bez sensu wtedy by wyszło.
nospor
Cytat
: Aha i co w przypadku, gdy dany parametr mógłby być pusty. Bez sensu wtedy by wyszło.
Naprawde nie potrafisz uzyc IF?
  1. if (!empty($params['category']))
  2. $where['category'] = 'c.id = ' . $params['category'];
in5ane
No dobra, to jest OK, myślałem, że na tej nowej tablicy $where macie jakieś pomysły fajnie pooperować.
phpion
Ja robię metodę w modelu, która przyjmuje tablicę filtrów. Na jej podstawie ręcznie dodaję WHERE do zapytania. Można to oczywiście puścić też automatem, ale robiąc to ręcznie masz większą kontrolę (ale fakt - więcej się napiszesz). Czasem 1 warunek filtru pociąga za sobą kolejne warunki WHERE i wtedy ładnie mogę to sobie owarunkować w metodzie. Ponadto czasem przekazuję takie filtry, które niekoniecznie odpowiadają kluczem nazwom kolumn lub wartością typom danych. Po prostu wiem jakie dane w efekcie chcę otrzymać, a jakie WHERE dodam to już moja sprawa.

Przykładowo:
  1. protected function get_list_filters(Database_Query_Builder_Select $query, array $filters, array $sorting) {
  2. $query = parent::get_list_filters($query, $filters, $sorting);
  3.  
  4. if (!empty($filters['id']) && Valid::digit($filters['id'])) {
  5. $query->where($this->table_name().'.id', '=', (int)$filters['id']);
  6. }
  7.  
  8. if (!empty($filters['user_id']) && Valid::digit($filters['user_id'])) {
  9. $query->where($this->table_name().'.user_id', '=', (int)$filters['user_id']);
  10. }
  11.  
  12. if (!empty($filters['created_at_from']) && Valid::datetime_format($filters['created_at_from'])) {
  13. $query->where($this->table_name().'.created_at', '>=', $filters['created_at_from']);
  14. }
  15.  
  16. if (!empty($filters['created_at_to']) && Valid::datetime_format($filters['created_at_to'])) {
  17. $query->where($this->table_name().'.created_at', '<=', $filters['created_at_to']);
  18. }
  19.  
  20. if (!empty($filters['deleted']) && Boolean::valid($filters['deleted'])) {
  21. $query->where($this->table_name().'.deleted_at', Boolean::stob($filters['deleted']) ? 'IS NOT' : 'IS', NULL);
  22. }
  23.  
  24. return $query;
  25. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.