SnakeEater
22.07.2010, 19:48:12
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
22.07.2010, 20:45:41
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
22.07.2010, 20:48:37
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
22.07.2010, 21:01:26
Czy metoda statyczna w modelu w stylu increaseSomethingValueInObject(id) będzie ok?
destroyerr
22.07.2010, 22:23:25
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
23.07.2010, 08:25:23
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
23.07.2010, 08:43:28
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
23.07.2010, 08:48:22
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
23.07.2010, 10:00:04
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:
class AnswerTable extends Doctrine_Table
{
public function increaseSomethingValueInObject()
{
}
}
class User extends Doctrine_Record
{
public function postSave(Doctrine_Event $event)
{
Doctrine::getTable('Answer')->increaseSomethingValueInObject();
}
}
phpion
23.07.2010, 10:07:16
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ć
destroyerr
23.07.2010, 14:31:38
@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.