![]() |
![]() |
![]()
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ć. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 14:56 |