Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] [Doctrine] Update query i akcja.
SnakeEater
post 22.07.2010, 19:48:12
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


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?
Go to the top of the page
+Quote Post
destroyerr
post 22.07.2010, 20:45:41
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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.
Go to the top of the page
+Quote Post
Crozin
post 22.07.2010, 20:48:37
Post #3





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

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


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);
Go to the top of the page
+Quote Post
SnakeEater
post 22.07.2010, 21:01:26
Post #4





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


Czy metoda statyczna w modelu w stylu increaseSomethingValueInObject(id) będzie ok?

Ten post edytował SnakeEater 22.07.2010, 21:01:55
Go to the top of the page
+Quote Post
destroyerr
post 22.07.2010, 22:23:25
Post #5





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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.
Go to the top of the page
+Quote Post
SnakeEater
post 23.07.2010, 08:25:23
Post #6





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


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.
Go to the top of the page
+Quote Post
phpion
post 23.07.2010, 08:43:28
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
SnakeEater
post 23.07.2010, 08:48:22
Post #8





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


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.
Go to the top of the page
+Quote Post
destroyerr
post 23.07.2010, 10:00:04
Post #9





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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. }
Go to the top of the page
+Quote Post
phpion
post 23.07.2010, 10:07:16
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post
destroyerr
post 23.07.2010, 14:31:38
Post #11





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


@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.
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 Wersja Lo-Fi Aktualny czas: 23.06.2025 - 01:35