Doctrine 2.1 - datetime列的默认值

时间:2011-10-08 17:46:03

标签: php doctrine-orm

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

protected $registration_date = date("Y-m-d H:i:s", time());

那怎么样?

7 个答案:

答案 0 :(得分:53)

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

use Doctrine\ORM\Mapping as ORM;

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

答案 1 :(得分:51)

默认值为CURRENT_TIMESTAMP:

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

或者对于较旧的Symfony版本:

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

为我工作......但是仅适用于MySQL

答案 2 :(得分:36)

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

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

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

这可以起作用,因为持久化类的构造函数不会被调用。

答案 3 :(得分: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;

答案 4 :(得分:19)

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

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

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

答案 5 :(得分:3)

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

这会奏效。只是发布以备参考。

答案 6 :(得分:0)

使用MySql和Symfony 3.4为我工作。

...
fields:
    start_date:
        type: date
        nullable: false
        options:
            default: '1910-01-01'
            comment: 'The default date is 1910-01-01'
...