Klauzula Having A Cdbcriteria

Potrzebuję zrobić filtrowanie danych na stronie i w tym celu uzywam formularza. Dane z formularza służą mi następnie do zbudowania kryteriów dla ActiveRecord. Używam w tym celu CDbCriteria. Tylko że jego metody tworzą warunki w klauzuli WHERE.Tymczasem bywa że potrzebuję dodać coś do klauzuli HAVING. Jak to ugryźć?

Wiem, ze można poprostu przypisac do właściwiści having, ale wolałabym coś inteligentniejszego, bo warunki mogą być zawiłe.

Mogłbyś wyjaśnić dlaczego metody CDbCriteria tworzą warunki WHERE ? Bo tego zdania po kilka przeczytaniach nadal nie rozumiem.

Opis klasy możesz znależć pod

http://www.yiiframework.com/doc/api/1.1/CDbCriteria

Nie wiem czy to jest inteligentniejsze :D

Jeśli używasz HAVING to znaczy, że robisz jakieś grupowanie. A jeśli robisz jakieś grupowanie to znaczy, że i tak masz dość niestandardowe użycie ActiveRecord. Myślę, że nie ma tutaj żadnych pomocniczych metod, które możesz użyć.

nineinchnick Czemu uważasz, że niestandardowe?

mirunho nie wiem dlaczego, ale tak jest. Wykorzystując addCondition() itp zawsze dostaje się warunki w klauzuli WHERE. No chyba, że coś źle robię.

To znaczy, że robi się to rzadko. Przynajmniej w moich projektach tak jest.

Z tego co piszesz dużo bardziej przyda Ci się query builder

Rozważałam użycie QB, ale nie za bardzo mi to odpowiada ActiveRecord bardzo ładnie obsługuje relacje i wystarczy sobie dobrze je w klasach podefiniować i zapytania się same konstruują. A tu bym musiała za każdym razem wszystkie joiny klepać z palca. To już to samo jak bym całe zapytanie napisała.

No nic zrobiłam jakąś protezę i działa. Szkoda, że nie ma takich zgrabnych metod jak dla klauzuli WHERE. Może w kolejnych wersjach?

Proponuję zgłosić to na Githubie, najlepiej z jakimś przykładem z życia wziętym.

Przykład z życia wzięty? Choćby zliczanie postów userów i wyciąganie najaktywniejszych. Masz AR ze zdefiniowanymi relacjami, robisz zapytanie gdzie z tabeli postów musisz wyciągnąć count i grupować po id usera. Chcąc wyciągnąć userów o ilości postów większej niż np 10 musisz dać warunek w klauzuli HAVING a nie WHERE. Tak działają wszystkie COUNTy MAXy MINy AVR itp funkcje aregujące, które wymagają grupowania.

To naprawde nie sa jakieś wyszukane zapytania i relacje.

Po pierwsze, wspomniałem o tym, aby ten przykład zamieścić razem ze zgłoszeniem na Githubie. Po drugie, chodziło mi o przykład uzasadniający dodawanie wielu pomocniczych metod, bo podanie jednego warunku ‘count(t.id)>10’ nie wymaga specjalnych narzędzi. W praktyce w HAVING jest dość mało warunków i nie są zagnieżdżone.

Nie twierdzę, że nie jest to potrzebne. Wiem tylko, że trzeba to uzasadnić aby zostało dodane do frameworka. A najlepiej napisać samemu i zrobić pull-request. Inaczej, jeśli reszta ludzi uznaje to za mało istotne, nikt sam z siebie tego nie zrobi.

http://www.yiiframework.com/doc/guide/1.1/en/database.arr#statistical-query

Wydaje mi się, że tutaj jest to czego potrzebujesz ;)