【发布时间】:2011-12-03 15:49:55
【问题描述】:
有人可以告诉我如何在日期时间列上添加默认值吗?我不能这样做:
protected $registration_date = date("Y-m-d H:i:s", time());
那怎么办?
【问题讨论】:
标签: php doctrine-orm
有人可以告诉我如何在日期时间列上添加默认值吗?我不能这样做:
protected $registration_date = date("Y-m-d H:i:s", time());
那怎么办?
【问题讨论】:
标签: php doctrine-orm
使用 MySql 和 Symfony 3.4 为我工作。
...
fields:
start_date:
type: date
nullable: false
options:
default: '1910-01-01'
comment: 'The default date is 1910-01-01'
...
【讨论】:
对于默认值 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。
【讨论】:
options={"default": "CURRENT_TIMESTAMP"}),通常也可以。但是在我的 postgres db 后面它被转换为 DEFAULT NOW() 这是 postgres 的方式。但是随后一个学说:迁移:差异会将 now() 误解为与 CURRENT_TIMESTAMP 的偏差,并在我每次运行它时创建一个差异文件。但是有了这个解决方案,学说就可以保证一切都是同步的。
ADD date_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL。
SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'date_create'
@var string @ORM\Column(name="login_at", type="datetime", options={"default" = "CURRENT_TIMESTAMP"})
这会奏效。只是发布以供将来参考。
【讨论】:
如果您想非常精确,也可以使用生命周期回调:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\HasLifecycleCallbacks
* ...
*/
class MyEntity
{
/**
* @ORM\PrePersist
*/
public function onPrePersistSetRegistrationDate()
{
$this->registration_date = new \DateTime();
}
}
【讨论】:
我认为,为datetime 完成自动填充的最佳方法是这样:
* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})
将逻辑放入构造函数不是正确的解决方案,因为设置默认值是SQL 客户端的责任。如果您决定不再使用 ORM - 您将失去业务逻辑。另外,如果使用构造函数,您将无法将默认时间戳添加到 现有行 的datetime 属性。
【讨论】:
"default": 0 更适用于学说迁移。
有一个用于自动化此的扩展...
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;
【讨论】:
您将属性映射为 DateTime 类型,然后使用新的 DateTime 实例在构造函数中设置值:
/**
* @Entity
* @Table(name="...")
*/
class MyEntity
{
/** @Column(type="datetime") */
protected $registration_date;
public function __construct()
{
$this->registration_date = new DateTime();
}
}
这可以作为持久类的构造函数在水合时不调用。
【讨论】:
onPrePersistSetRegistrationDate 其中添加HasLifecycleCallbacks,PrePersist 注释2)我想设置一个默认值需要我添加第三个库@Gedmo\Timestampable?!! 3) CURRENT_TIMESTAMP 有时不好。例如:当您的脚本服务器在中国但数据库服务器在美国时。 (当然,这不是很常见,但是有这样的情况)