关于php:Doctrine 2.1 – datetime列的默认值

Doctrine 2.1 - datetime column default value

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

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

那怎么办?


对于默认值,当前时间戳:

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

或者对于旧的symfony版本:

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

为我工作…但是,这只适用于MySQL。


如果希望非常精确,还可以使用生命周期回调:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\HasLifecycleCallbacks
 * ...
 */

class MyEntity
{
    /**
     * @ORM\PrePersist
     */

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * @Entity
 * @Table(name="...")
 */

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

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

它作为持久类的构造函数工作,不会在水合时调用。


这有一个自动的扩展…

https://github.com/l3p4rd/doctrineextensions/blob/master/doc/timestampable.md网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
     * @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;


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

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

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


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

这是可行的。只是为了将来的参考。


为我和mysql和symfony 3.4一起工作。

1
2
3
4
5
6
7
8
9
...
fields:
    start_date:
        type: date
        nullable: false
        options:
            default: '1910-01-01'
            comment: 'The default date is 1910-01-01'
...