![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam pewien problem. Wytłumaczę go na zasadzie query buildera, żeby było bardziej jasne o co mi chodzi. Taki query builder dobrze jakby obsługiwał method chining, tak też można wtedy przykładowo użyć najpierw where, później select, a gdzieś na końcu from. Ogólnie można pomieszać kolejność. Załóżmy, że każde wywołanie jakiejś metody typu where, select, from itp dodaje do jednej większej tablicy swój klucz wraz z odpowiednimi wartościami. Jeżeli ktoś wie jak działa Zend_Db_Select, to mniej więcej zrozumie o co mi chodzi. I teraz w przypadku takiego buildera, na samym końcu wywołujemy jakąś metodę, która całość naszego zapytania skleja. W Zend_Db_Select, jest to foreach, który przelatuje po tablicy i dla odpowiednich kluczy wywołuje odpowiednie metody, które z tablicy pobierają dane i tworzą zapytanie.
Problem jaki ja mam, jest co w przypadku użycia innej kolejności? Powiedzmy użyjemy naszego buildera w taki sposób:
Jest to jak widać dość nietypowa konstrukcja zapytania, i można nawet przypadkiem, aczkolwiek nie tak jak w przykładzie, ale można zamienić kolejność niektórych rzeczy. Przykładowo użyć where za order i wtedy będziemy mieli niepoprawne zapytanie (w przypadku Zend_Db_Select jest to metoda assemble, która skleja sobie zapytanie). Pomysłem na rozwiązanie mogłoby być posortowanie tablicy, za pomocą chociażby uksort, wraz z funkcją zwrotną. Teraz tylko pytanie, w jaki sposób określić konkretną kolejność dla konkretnych elementów, bo zapytanie może być różne, możemy użyć order, a nie musimy, to samo tyczy się where, limit, offset, group, union i tym podobnych. Pomyślałem że mogę w funkcji zwrotnej dla uksort, stworzyć kolejną tablicę, i do tej tablicy wrzucać elementy w określonej kolejności i dopiero ją zwrócić. Tylko mam właśnie problem, z wymyśleniem tego, w jaki sposób dana pętla miałaby wiedzieć ile tych elementów już jest w tablicy, oraz na jakie miejsce wstawić dany element.. Drugim pomysłem jest już podczas tworzenia zapytania, czyli podczas wywołania jakiejś metody, przykładowo where, już wtedy dodawana do tablicy jest wraz z swoją kolejnością. Aczkolwiek trzeba by trochę takiego buildera przebudować, i lepszą opcją byłoby sortowanie tuż przed sklejeniem zapytania.. Za wszelkie sugestie z góry dziękuje. Jeżeli napisałem coś nie jasno, to śmiało proszę pisać, z chęcią spróbuje to w jakiś inny bardziej zrozumiały sposób opisać. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
tablica jest asocjacyjna, stąd sortowanie uksort (IMG:style_emoticons/default/wink.gif) nie chciałbym jej przerabiać na zwykłą tablicę żeby określić kolejność danej "metody". Pokaż jak możesz oczywiście, jak ty to zrobiłeś podczas sklejania takiej tablicy. Sam zrobiłem to póki co podobnie jak w Zend_Db_Select w metodzie assamble, czyli leci foreach po kluczach i dla podanych kluczy wywołuje odpowiednie metody. I to jest ok, o ile jest zachowana kolejność. I problem w sumie nie tylko w builderze teraz dostrzegam, ale i w kilku innych klasach, w których wykorzystuje method chining i w nich jest wymagana odpowiednia kolejność.. Stąd pomysł na sortowanie, które łatwiej zaimplementować w wielu klasach niż każdą osobno refaktoryzować..
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 11.10.2025 - 00:15 |