Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Aktualizacja rekordów
Forum PHP.pl > Forum > PHP
blackroger
Witam....pracuję z frameworkiem symfony ale myślę, że problem jest na tyle ogólny że można go umieścić tutaj...
Mianowicie...jestem w trakcie projektowania serwisu aukcyjnego i mam dylemat...Każdą aukcję opieram na statusie. Czyli jeżeli aukcja ma status active oznacza, że jest dostępna i można licytować itd. Jak najlepiej zrobić aktualizację tych aukcji? Myślałem, żeby sprawdzać warunek i aktualizować w momencie pierwszego wejścia jakiegokolwiek usera na daną aukcję po czasie zakończenia. Czyli powiedzmy aukcja trwa do 12 00, w momencie jak ktoś wejdzie po 12 00 będzie sprawdzany warunek i zmieniany status. Ale wtedy też jest problem, bo w momencie wyszukiwania aukcji będą również widoczne te które mają jeszcze niezmieniony status (czyli np. nikt jeszcze nie wszedł na taką ). Myślałem też o metodzie np. checkAndChangeStatus(), która byłaby w każdym możliwym miejscu wywoływana w celu aktualizacji. Jeszcze wcześniej myślałem na bezpośrednim działaniu na bazie (PL/SQL albo wyzwalacze) ale po dłuższym zastanowieniu też straciło to sens. Proszę o pomoc i wypowiedź człowieka, który takie coś robił i wie jak to najlepiej zrobić.
Pozdrawiam.
nospor
To nie ma żadnego związku z programowaniem obiektowym. Przenoszę.
LBO
Status aukcji to raczej abstrakcyjna właściwość, czyli może zależeć od - nawet kilku - innych zmiennych.
W tym co opisujesz to nic innego jak dynamiczne porównanie dat przy pobieraniu zestawu zakończonych/niezakończonych aukcji.

Dla Propela to bedzie:
  1. class AuctionPeer extends BaseAuctionPeer
  2. {
  3. public static function doSelectAcive(Criteria $criteria, PropelPDO $con = null)
  4. {
  5. $c = clone $criteria;
  6. $c->add(self::FINISHED_AT, Criteria::CURRENT_TIMESTAMP, Criteria::GREATER_THAN);
  7. // więcej warunków
  8. $c->addAnd(self::WINNER_ID, null, Criteria::ISNULL); // prosty przykład dla aukcji posiadającej tylko jednego zwycięzcę
  9. return self::doSelect(Criteria $criteria, PropelPDO $con = null);
  10. }
  11.  
  12. public static function doSelectFinished(Criteria $criteria, PropelPDO $con = null)
  13. {
  14. $c = clone $criteria;
  15. $c->add(self::FINISHED_AT, Criteria::CURRENT_TIMESTAMP, Criteria::LESS_EQUAL);
  16. // więcej warunków np.
  17. $c->addOr(self::WINNER_ID, null, Criteria::ISNOTNULL); // prosty przykład dla aukcji posiadającej tylko jednego zwycięzcę
  18. return self::doSelect(Criteria $criteria, PropelPDO $con = null);
  19. }
  20. }


Pisze z palca, więc mogą być literówki.
Crozin
Właściwie to dwa sensowne rozwiązania są:
1) Status rozpoznawać na podstawie daty zakończenia aukcji (tj sprawdzać czy data zakończenia aukcji (kolumna w bazie danych) jest mniejsza/większa od aktualnej)
2) Przy pomocy Crona co np. 5 minut odpalać skrypt wyszukujący zakończone aukcje i zmieniający ich status.
blackroger
Dzięki...tak jak myślałem, że sprowadzi się to i tak do porównania dat rekordów. Miałem nadzieję, że można jakoś uprościć sposób wyszukiwania, no ale rzeczywiście ciężko bez żadnej akcji wywołać jakąś metodę smile.gif Doszedłem do wniosku, że najlepiej będzie porównywać pod datach i odpalać crona co jakiś czas w celu zmiany tego statusu...dziękuję
blackroger
Dzięki...tak jak myślałem, że sprowadzi się to i tak do porównania dat rekordów. Miałem nadzieję, że można jakoś uprościć sposób wyszukiwania, no ale rzeczywiście ciężko bez żadnej akcji wywołać jakąś metodę smile.gif Doszedłem do wniosku, że najlepiej będzie porównywać pod datach i odpalać crona co jakiś czas w celu zmiany tego statusu...dziękuję
LBO
Ja uważam, że możesz całkowicie zrezygnować ze statusu i raczej postawić na status jako wypadkową wartości np. innych kolumn (zaktualizowałem przykład w poprzednim poście). Ewentualnie zastosować rozwiązanie mieszane.

Nie twierdzę, że sprawdzi się to w każdych warunkach.
blackroger
Ok. Wielkie dzięki. Ze statusu nie mogę całkowicie zrezygnować bo ma mieć ona jeszcze takie stany jak 'prepared' gdzie będzie siedzieć w takim prepare lobby, 'cancelled' - to wiadomo, i jeszcze być może kilka innych, ale z tymi statusami nie będzie już problemu bo one będą się zmieniały w odpowiedzi na akcję użytkownika, więc bez problemu...
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.