Jak ustawić wartość domyślną w Doctrine 2?
php
orm
doctrine-orm
Jiew Meng
źródło
źródło
Odpowiedzi:
Domyślne wartości bazy danych nie są obsługiwane „przenośnie”. Jedynym sposobem użycia domyślnych wartości bazy danych jest użycie
columnDefinition
atrybutu mapowania, w którym określa sięSQL
fragmentDEFAULT
kodu ( łącznie z przyczyną) dla kolumny, na którą mapowane jest pole.Możesz użyć:
Preferowane są wartości domyślne na poziomie PHP, ponieważ są one również odpowiednio dostępne dla nowo utworzonych i utrwalonych obiektów (Doctrine nie wróci do bazy danych po utrwaleniu nowego obiektu w celu uzyskania wartości domyślnych).
źródło
Zauważ, że używa to SQL
DEFAULT
, który nie jest obsługiwany w niektórych polach, takich jakBLOB
iTEXT
.źródło
options
parametr jest również przydatny dlaunsigned
wartości. zobacz tę odpowiedźoptions={"default": 0}
Uważaj, aby używać „i nie”, ponieważ powoduje to błędy w mojej wersji doktryny.Skonfiguruj konstruktor w swojej encji i ustaw tam domyślną wartość.
źródło
Posługiwać się:
i nie:
Na przykład:
źródło
Aktualizacja
Jeszcze jeden powód, dla którego przeczytaj dokumentację Symfony, która nigdy nie wyjdzie z mody. Istnieje proste rozwiązanie dla mojego konkretnego przypadku i polega na ustawieniu
field type
opcjiempty_data
na wartość domyślną.Ponownie, to rozwiązanie jest tylko dla scenariusza, w którym puste dane wejściowe w formularzu ustawiają pole DB na null.
tło
Żadna z poprzednich odpowiedzi nie pomogła mi w moim konkretnym scenariuszu, ale znalazłem rozwiązanie.
Miałem pole formularza, które musiało zachowywać się następująco:
Następnie wypróbowałem wszystkie podane tutaj zalecenia. Pozwól mi je wymienić:
WAŻNY
Pola formularza Symfony zastępują wartości domyślne ustawione dla klasy Entity. Oznacza to, że w schemacie dla bazy danych może być zdefiniowana wartość domyślna, ale jeśli pozostawisz niepotrzebne pole puste podczas przesyłania formularza,
form->handleRequest()
wnętrzeform->isValid()
metody zastąpi te wartości domyślne wEntity
klasie i ustawi je na wartości pola wejściowego. Jeśli wartości pola wejściowego są puste,Entity
właściwość zostanie ustawiona nanull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Moje obejście
Ustawić wartość domyślną na kontrolerze po
form->handleRequest()
wewnątrzform->isValid()
metody:Nie jest to piękne rozwiązanie, ale działa. Prawdopodobnie mógłbym zrobić,
validation group
ale mogą być ludzie, którzy postrzegają ten problem jako transformację danych, a nie sprawdzanie poprawności danych , pozostawiam to tobie do podjęcia decyzji.Zastąp seter (nie działa)
Próbowałem również zastąpić
Entity
seter w ten sposób:To, chociaż wygląda na czystsze, nie działa . Powodem jest to, że
form->handleRequest()
metoda zła nie używa metod ustawiających Model do aktualizacji danych (form->setData()
po więcej szczegółów).źródło
Obejście Kiedyś było
LifeCycleCallback
. Na przykład wciąż czekam, aby sprawdzić, czy istnieje jakaś „natywna” metoda@Column(type="string", default="hello default value")
.źródło
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
Możesz to zrobić również za pomocą xml:
źródło
Oto jak sam to rozwiązałem. Poniżej znajduje się przykład jednostki z domyślną wartością dla MySQL. Wymaga to jednak również skonfigurowania konstruktora w jednostce i ustawienia wartości domyślnej.
źródło
columnDefinition
idzie bezpośrednio ponownie w celu posiadania ORM, czyli abstrakcji z bazy danych. To rozwiązanie zakłóci przenośność, sprawi, że twoje oprogramowanie będzie zależne od dostawcy DB, a także złamie narzędzia Doctrine Migrations.Działa dla mnie również w bazie danych mysql:
źródło
Nic z tego nie działało dla mnie. Znalazłem trochę dokumentacji na stronie doktryny, która mówi, aby ustawić wartość bezpośrednio, aby ustawić wartość domyślną.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
To wstawiło wartość, którą chciałem.
źródło
Dodanie do świetnej odpowiedzi na @romanb.
Dodaje to trochę narzutu przy migracji, ponieważ oczywiście nie można utworzyć pola bez ograniczenia zerowego i bez wartości domyślnej.
Dzięki tej odpowiedzi zachęcam do zastanowienia się, dlaczego w ogóle potrzebujesz domyślnej wartości w bazie danych? I zwykle pozwala na tworzenie obiektów bez ograniczenia zerowego.
źródło
Jeśli używasz definicji yaml dla swojej encji, następujące działania działają na mnie w bazie danych postgresql:
źródło
$entity->setFieldName()
używałeś przed spłukaniem? Doctrine wydaje się definiować wartość domyślną na zero. Jedynym rozwiązaniem w YAML jest określenie wartości domyślnej W klasie podmiot, który wydaje mi się głupie, ponieważ już zdefiniowane w YAML ... -_-Walczyłem z tym samym problemem. Chciałem mieć domyślną wartość z bazy danych do encji (automatycznie). Zgadnij co, zrobiłem to :)
źródło
Chociaż ustawienie wartości w konstruktorze działałoby, lepszym rozwiązaniem może być użycie zdarzeń cyklu życia Doctrine.
Wykorzystując
prePersist
Zdarzenie cyklu życia, możesz ustawić wartość domyślną dla swojej jednostki tylko przy początkowym utrwaleniu.źródło
hack
. Nigdy nie polegaj na hakach.Zachowaj ostrożność podczas ustawiania wartości domyślnych w definicji właściwości! Zrób to w konstruktorze, aby zachować bezproblemowe działanie. Jeśli zdefiniujesz to w definicji właściwości, utrwal obiekt w bazie danych, a następnie wykonaj częściowe ładowanie, a następnie właściwości nie załadowane ponownie będą miały wartość domyślną. Jest to niebezpieczne, jeśli chcesz ponownie utrwalić obiekt.
źródło