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 557
Pomógł: 6315
Dołączył: 27.12.2004




To nie ma żadnego związku z programowaniem obiektowym. Przenoszę.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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ę 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ę 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 22:22