看了一会儿之后,我仍然找不到通过数据库服务器插入CURRENT_TIMESTAMP的方法(作为INSERT
上的默认值)。
问题:当您将对象持久保存到数据库时,Doctrine会将缺少的字段显式设置为NULL。所以看起来,在表定义中设置默认值,根本没有任何效果: - (
我不想通过PHP设置时间(例如$object->setTimestamp(new \DateTime());
)因为这可能会返回与数据库服务器不同的时间,如下所述:https://stackoverflow.com/a/3705090/1668200
到目前为止我尝试过:
按字面意思发送NOW
(例如$object->setTimestamp('NOW()');
),如下所述:https://stackoverflow.com/a/13850741/1668200
=>无效:Error: Call to a member function format() on string
在持久化之前从对象中删除'timestamp'属性(参见https://stackoverflow.com/a/3600758/1668200)也不起作用:无论如何,该字段被Doctrine设置为NULL。
我找到的任何其他解决方案(包括Doctrine扩展名'Timestampable'https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/timestampable.md)都使用PHP的时间。
答案 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;
请记住,如果更新现有表,这将不允许以前的行为空。