Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] MVC i olbrzymie zapytania
in5ane
post 5.03.2014, 08:47:57
Post #1





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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?


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
aniolekx
post 5.03.2014, 08:53:06
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


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.
Go to the top of the page
+Quote Post
in5ane
post 5.03.2014, 08:59:29
Post #3





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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.

Ten post edytował in5ane 5.03.2014, 09:01:07


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
nospor
post 5.03.2014, 09:03:28
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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'];


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
in5ane
post 5.03.2014, 09:04:11
Post #5





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


No dobra, to jest OK, myślałem, że na tej nowej tablicy $where macie jakieś pomysły fajnie pooperować.


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
phpion
post 5.03.2014, 10:24:45
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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. }
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:30