Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Aktualizacja rekordów
blackroger
post
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


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.

Ten post edytował blackroger 23.11.2009, 01:49:15
Go to the top of the page
+Quote Post
nospor
post
Post #2





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




To nie ma żadnego związku z programowaniem obiektowym. Przenoszę.
Go to the top of the page
+Quote Post
LBO
post
Post #3





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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.

Ten post edytował LBO 23.11.2009, 14:37:02
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
blackroger
post
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


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ę (IMG:style_emoticons/default/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ę
Go to the top of the page
+Quote Post
blackroger
post
Post #6





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


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ę (IMG:style_emoticons/default/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ę
Go to the top of the page
+Quote Post
LBO
post
Post #7





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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.

Ten post edytował LBO 23.11.2009, 14:44:55
Go to the top of the page
+Quote Post
blackroger
post
Post #8





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


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

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

 



RSS Aktualny czas: 24.12.2025 - 14:02