2011-10-08 56 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