Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] [Doctrine] Update query i akcja.
Forum PHP.pl > Forum > PHP > Frameworki
SnakeEater
Witam,
potrzebuję updatetować obiekt na podstawie formularza. Aby zaoszczędzić na robocie chcę zrobić update poprzez query zamiast przez pobranie i save. Mam taki problem gdzie zrobić update rekordu. Chodzi tylko o zwiększenie wartości pola integer o jeden. Zastanawiam się czy action to właściwe miejsce na doctrine query. Może lepiej w modelu? A może w klasie dziedziczącej po table?
destroyerr
Akcja to ewidentnie nie miejsce na takie działania. Tylko i wyłącznie model, a dokładnie to zależy od tego jak masz go zorganizowany.
Crozin
Oczywiście, że w modelu - od tego on jest. Ze strony akcji możesz się co najwyżej ograniczyć do czegoś w stylu AbcRepo::getInstance()->increaseDef($id);
SnakeEater
Czy metoda statyczna w modelu w stylu increaseSomethingValueInObject(id) będzie ok?
destroyerr
Dla mnie by nie była ok z wielu powodów. Tym bardziej jeśli Twój model sprowadza się do gołych klas Doctrine, to metoda statyczna jest już całkowicie niepotrzebna.
SnakeEater
No to jak zrobić to właściwie bez pobierania modelu zwiększania pola i zapisywania go? Tabela nazywa się Answer, a pole do zwiększania wartości to votes.
phpion
Może to dobry przykład do zastosowania triggera? Zakładam, że w momencie dodania rekordu do tabeli X chcesz zwiększyć licznik w tabeli Y - do takich celów triggery nadają się idealnie.
SnakeEater
No właśnie nie. Użytkowanik ma do wyboru w formulardzu jedna z dwóch odpowiedzi. Dla wybranej odpowiedzi Answer muszę zwiększyć pole votes.
destroyerr
Też można zastosować wyzwalacz. Problem jest taki, że trigger niesie z sobą wiele problemów i rozrzuca działanie aplikacji na kod i na bazę.

Nie wiem jak masz to zrobić, bo nie wiem jak masz zorganizowany model. Jeśli jednak Twój "model" to co generuje Doctrine, to chyba dosyć dobrym rozwiązaniem byłaby metoda w tabeli. Przykład:
  1. class AnswerTable extends Doctrine_Table
  2. {
  3. public function increaseSomethingValueInObject()
  4. {
  5. }
  6. }
  7.  
  8. class User extends Doctrine_Record
  9. {
  10. public function postSave(Doctrine_Event $event)
  11. {
  12. Doctrine::getTable('Answer')->increaseSomethingValueInObject();
  13. }
  14. }
phpion
Cytat(destroyerr @ 23.07.2010, 11:00:04 ) *
Problem jest taki, że trigger niesie z sobą wiele problemów i rozrzuca działanie aplikacji na kod i na bazę.

Odbiegając nieco od tematu: moim zdaniem to nie jest aż taki problem. Sam często korzystam z triggerów czy własnych funkcji w bazie danych (akurat PostgreSQL). Osobiście wychodzę z założenia, że to co można oprzeć na bazie danych i co przyspieszy działanie/zautomatyzuje dany proces, należy wykonać na bazie danych. Zgodzę się, że przy ewentualnej migracji na inny silnik bazy danych mogą nastąpić komplikacje (konieczność przeniesienia wspomnianych elementów z bazy danych), ale czy jest to częste zjawisko? No ale to moje zdanie, nie każdy musi się z nim zgadzać smile.gif
destroyerr
@phpion pełna zgoda, że warto przyspieszać i że rzadko zmieniany jest silnik bazy danych. W przypadku prostego triggera, można uznać, że nie ma problemów, ale przy bardziej skomplikowanych zależnościach pojawiają się problemy np. z testowaniem (pomimo pgTAP i mu podobnych) i utrzymaniem takiego kodu. Niestety, wszystko zależy od konkretnego przypadku i to w stosunku do niego trzeba podejmować decyzje.
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.