2011-10-08 15 views

Odpowiedz

32

mapować nieruchomość jako typ DateTime następnie ustawić wartość w konstruktorze przy użyciu nowej instancji DateTime:

/** 
* @Entity 
* @Table(name="...") 
*/ 
class MyEntity 
{ 
    /** @Column(type="datetime") */ 
    protected $registration_date; 

    public function __construct() 
    { 
     $this->registration_date = new DateTime(); 
    } 
} 

to działa jako konstruktora utrwalonej klasy nie nazywa się po uwodnieniu.

+0

Głosuję za tą odpowiedzią, ponieważ jest to czyste rozwiązanie PHP. Inne odpowiedzi mogą: 1) potrzebować specjalnej wiedzy 'onPrePersistSetRegistrationDate' która dodaje' HasLifecycleCallbacks', 'PrePersist' adnotacje 2) Chcę ustawić domyślną wartość potrzebuję mi dodać 3. bibliotekę' @Gedmo \ Timestampable'? !! 3) CURRENT_TIMESTAMP czasami nie jest dobry. Np .: kiedy serwer skryptów w Chinach, ale serwer bazy danych w Ameryce. (przyczyny, to nie jest bardzo powszechne, ale są takie przypadki) – Yarco

41

Można również użyć zwrotnych cyklu życia, jeśli chcesz być bardzo precyzyjne:

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\HasLifecycleCallbacks 
* ... 
*/ 
class MyEntity 
{ 
    /** 
    * @ORM\PrePersist 
    */ 
    public function onPrePersistSetRegistrationDate() 
    { 
     $this->registration_date = new \DateTime(); 
    } 
} 
+2

Preferuję tę odpowiedź, ponieważ znacznie wyraźniej wyjaśnia, w jaki sposób Doctrine sobie z tym poradzi. –

+1

+1 Wprowadzi najnowszą datę do rekordu. Jeśli rekord ma dwie daty modified_datetime i created_datetime. Jeśli wstawisz modified_datetime do konstruktora, czas created_time może być nowszy niż modified_datetime. –

+0

Aby uzyskać informacje na temat wszystkich możliwości wywoływania zwrotnego cyklu życia: http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#reference-events-lifecycle-events – fyrye

17

Jest to rozszerzenie dla tej automatyzacji tego ...

https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/timestampable.md

/** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_added", type="datetime") 
    * @Gedmo\Timestampable(on="create") 
    */ 
    private $date_added; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_modified", type="datetime") 
    * @Gedmo\Timestampable(on="update") 
    */ 
    private $date_modified; 
+2

To wymaga upvoting jak to jest z pewnością najlepszy sposób na zrobienie tego. – Sc0ttyD

+2

@ Sc0ttyD Po co używać rozszerzenia, jeśli możesz osiągnąć ten sam cel z podstawowymi funkcjami? – luba

+0

Nie mam pojęcia - nie używaj już PHP, to było 3 lata temu :-) – Sc0ttyD

32

za zwłokę wartość CURRENT_TIMESTAMP:

 @ORM\Column(name="created_at", type="datetime", options={"default": 0}) 

pracował dla mnie ...

+6

To powinna być teraz najwyższa odpowiedź, IMO, szczególnie jeśli chcesz, aby schemat tabeli sam przyjmował CURRENT_TIMESTAMP – skrilled

+1

Dzięki. Bardzo mi to pomogło. Użyłem 'options = {" default ":" CURRENT_TIMESTAMP "})', przed którym ogólnie pracował również. Ale z moim postgres db za to został przekształcony na DEFAULT NOW(), który jest sposobem postgres. Ale wtedy doktryna: migrations: diff źle zinterpretuje teraz() jako odchylenie od CURRENT_TIMESTAMP i utworzy plik diff za każdym razem, gdy go uruchomię. Ale dzięki temu rozwiązaniu doktryna stwierdza, że ​​wszystko jest zsynchronizowane. – luba

+1

Świetna odpowiedź i IMO, najczystszy sposób na zrobienie tego. Jeśli jest to interesujące, zostało to przetłumaczone jako "ADD date_added TIMESTAMP (0) BEZ STREFY CZASOWEJ CURRENT_TIMESTAMP NOT NULL" dla mnie. – crmpicco

16

myślę, że najlepszym sposobem osiągnięcia autouzupełnianie datetime to zrobić tak:

* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"}) 

Wykorzystanie logiki konstruktora nie jest dobrym rozwiązaniem, ponieważ ustawienie domyślne wartości to Odpowiedzialność klienta SQL. Jeśli zdecydujesz, że nie będziesz już używać ORM - utracisz logikę biznesową. Dodatkowo, jeśli korzystasz z konstruktora, nie będziesz w stanie dodawać domyślnych znaczników czasu do datetime atrybutów dla istniejących wierszy.

+0

dziękuję: D najlepsza odpowiedź – julestruong

+0

To nie działa w doktrynie 2.5. – magnetik

+0

Jak wspomniano poniżej "domyślnie": 0 "działa lepiej w przypadku migracji doktryn. – luba

Powiązane problemy