2011-10-08 61 views

回答

32

你映射你的財產作爲DateTime類型然後設置使用新DateTime實例構造函數中的值:

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

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

這可以作爲一個持久化類的構造函數時水化不叫。

+0

我投這個答案,因爲它是純PHP解決方案。其他答案可能:1)需要特殊的知識'onPrePersistSetRegistrationDate',它添加'HasLifecycleCallbacks','PrePersist'註解2)我想設置一個默認值需要我添加第三個庫'@Gedmo \ Timestampable'?!! 3)CURRENT_TIMESTAMP有時不好。例如:當你在中國的腳本服務器,但在美國的數據庫服務器。 (原因,這不是很常見,但也有這種情況) – Yarco

41

您還可以使用生命週期回調,如果你想成爲非常精確:

use Doctrine\ORM\Mapping as ORM; 

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

我更喜歡這個答案,因爲它更清楚地說明了Doctrine將如何處理它。 –

+1

+1它會將最新日期記錄在記錄中。如果記錄有兩個日期modified_datetime和created_datetime。如果將modified_datetime放入構造函數中,created_time可能會比modified_datetime更新。 –

+0

有關生命週期回調的所有功能的參考:http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#reference-events-lifecycle-events – fyrye

17

有這個這個自動化的延伸......

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

這需要upvoting,因爲它當然是最好的方法來做到這一點。 – Sc0ttyD

+2

@ Sc0ttyD爲什麼使用擴展如果你能達到與基本功能完全相同的目標? – luba

+0

不知道 - 不要再使用PHP了,這是3年前:-) – Sc0ttyD

32

對於默認價值CURRENT_TIMESTAMP:

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

爲我工作...

+6

這應該是現在最好的答案IMO,尤其是如果你想讓表模式本身承擔CURRENT_TIMESTAMP – skrilled

+1

謝謝。這幫了我很多。我已經使用了'options = {「default」:「CURRENT_TIMESTAMP」})'之前一般工作。但是在我的postgres後面,它變成了DEFAULT NOW(),這是postgres的方式。但是然後一個教條:migrations:diff會誤解now()作爲與CURRENT_TIMESTAMP的偏差,並在每次運行它時創建一個diff文件。但是通過這個解決方案原則得到了一切都是同步的。 – luba

+1

偉大的答案和IMO,這是最乾淨的方式。如果它有任何興趣,這被翻譯爲'ADD date_added TIMESTAMP(0)WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL' for me。 – crmpicco

16

我認爲,實現自動填充爲datetime最好的辦法就是讓這樣的:

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

把邏輯構造是不正確的解決方案,因爲默認設置值爲SQL客戶端責任。如果您決定不再使用ORM,您將失去業務邏輯。另外,如果使用構造函數,您將無法將默認時間戳添加到屬性現有行

+0

謝謝:D最佳答案 – julestruong

+0

這不適用於教條2.5。 – magnetik

+0

如下所述''默認值':0'對於原則的遷移效果更好。 – luba