Doctrine:数据库将CURRENT_TIMESTAMP设置为默认值(即不是PHP)

时间:2015-08-11 16:38:26

标签: php symfony doctrine-orm

看了一会儿之后,我仍然找不到通过数据库服务器插入CURRENT_TIMESTAMP的方法(作为INSERT上的默认值)。

问题:当您将对象持久保存到数据库时,Doctrine会将缺少的字段显式设置为NULL。所以看起来,在表定义中设置默认值,根本没有任何效果: - (

我不想通过PHP设置时间(例如$object->setTimestamp(new \DateTime());)因为这可能会返回与数据库服务器不同的时间,如下所述:https://stackoverflow.com/a/3705090/1668200

到目前为止我尝试过:

我找到的任何其他解决方案(包括Doctrine扩展名'Timestampable'https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/timestampable.md)都使用PHP的时间。

3 个答案:

答案 0 :(得分:0)

看看这个:https://stackoverflow.com/a/29384596/3255540它应该解决Error: Call to a member function format() on string的问题并强制SQL NOW()发送到数据库。

答案 1 :(得分:0)

更新:这与VasekPurchart \ DoctrineDateTimeImmutableTypesBundle不再兼容。它不会与Doctrine DBAL 2.6一起使用。见https://github.com/VasekPurchart/Doctrine-Date-Time-Immutable-Types-Bundle/issues/17

所以,把它全部包起来,这是一步一步的指示:

1)创建一个新类" DateTimeNow&#34 ;;一个好的位置可能是AppBundle/Entity/DateTimeNow.php

<?php
namespace AppBundle\Entity;
class DateTimeNow
{
    public function format() 
    {
        return 'NOW()';
    }
}

2)在你的待加时间实体中,添加一个在保存新实体时要执行的函数(即在每个INSERT上):

public function doPrePersist()
{
    $this->timestamp = new DateTimeNow();
}

3)将此功能注册为Lifecycle Callback prePersist。有关注释,请参阅http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-prepersist。对于YAML:

AppBundle\Entity\Whatever:
    # ...
    lifecycleCallbacks:
        prePersist: [ doPrePersist ]

那就是它! : - )

现在,当您持久保存空对象时,这就是生成的查询:

INSERT INTO public.whatever(id, text, timestamp) VALUES (?, ?, ?)
Parameters: { 1: null, 2: null, 3: NOW() } 

答案 2 :(得分:0)

/**
 * @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
 */
protected $created;     

请记住,如果更新现有表,这将不允许以前的行为空。