Doctrine 2.1 - datetime列的默认值

Krz*_*zos 38 php doctrine-orm

有人能告诉我如何在datetime列上添加默认值吗?我不能这样做:

protected $registration_date = date("Y-m-d H:i:s", time());
Run Code Online (Sandbox Code Playgroud)

又怎样?

san*_*nis 58

对于默认值CURRENT_TIMESTAMP:

     @ORM\Column(name="created_at", type="datetime", options={"default": "CURRENT_TIMESTAMP"})
Run Code Online (Sandbox Code Playgroud)

或者对于较旧的Symfony版本:

     @ORM\Column(name="created_at", type="datetime", options={"default": 0})
Run Code Online (Sandbox Code Playgroud)

为我工作......然而这只适用于MySQL.

  • 这应该是现在IMO的最佳答案,特别是如果您希望表模式本身采用CURRENT_TIMESTAMP (7认同)
  • 很好的答案,在我看来,这是最干净的方法。如果有任何兴趣,这对我来说被翻译为“添加日期添加时间戳(0)没有时区默认当前时间戳不为空”。 (2认同)
  • 值得一提的是,这仅适用于MySQL> = 5.6.5,MySQL下面不支持将CURRENT_TIMESTAMP设置为DATETIME列的默认值.请参阅/sf/answers/11818271/ (2认同)

Ale*_*tis 54

如果您想要非常精确,还可以使用生命周期回调:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\HasLifecycleCallbacks
 * ...
 */
class MyEntity
{
    /**
     * @ORM\PrePersist
     */
    public function onPrePersistSetRegistrationDate()
    {
        $this->registration_date = new \DateTime();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案,因为它更清楚地说明了Doctrine将如何处理它. (4认同)
  • +1它会将最新日期记录在记录中.如果记录有两个日期modified_datetime和created_datetime.如果将modified_datetime放在构造函数中,则created_time可能比modified_datetime更新. (3认同)

Max*_*Max 39

您将属性映射为DateTime类型,然后使用新的DateTime实例在构造函数中设置值:

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

    public function __construct()
    {
        $this->registration_date = new DateTime(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

这是因为持久化类的构造函数不会被调用.


rat*_*m3n 21

这种自动化有一个扩展...

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;
Run Code Online (Sandbox Code Playgroud)

  • @ Sc0ttyD如果你可以使用基本功能达到完全相同的目标,为什么要使用扩展? (3认同)
  • 这需要upvoting,因为它肯定是最好的方法. (2认同)

小智 20

我认为,完成自动填充的最佳方法datetime是做到这样:

* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})
Run Code Online (Sandbox Code Playgroud)

将逻辑放到构造函数是不正确的解决方案,因为设置默认值是SQL客户端的责任.如果您决定不再使用ORM - 您将失去业务逻辑.另外,如果使用构造函数,您将无法datetime现有行的属性添加默认时间戳.


小智 6

@var string @ORM\Column(name="login_at", type="datetime", options={"default" = "CURRENT_TIMESTAMP"})
Run Code Online (Sandbox Code Playgroud)

这将起作用。只是发布以供将来参考。

  • 这不起作用:违反完整性约束:1048 列“login_at”不能为空 (3认同)