我正在寻找一种使用TIMESTAMP
而不是DATETIME
MySql 来制作学说的方法。
另外我需要设置ON UPDATE CURRENT_TIMESTAMP
和CURRENT_TIMESTAMP
作为默认值。
我希望有可能在 PHP 注释中包含所有这些代码,以便将所有内容集中在一个位置。
我怎样才能做到这一点?
我正在寻找一种使用TIMESTAMP
而不是DATETIME
MySql 来制作学说的方法。
另外我需要设置ON UPDATE CURRENT_TIMESTAMP
和CURRENT_TIMESTAMP
作为默认值。
我希望有可能在 PHP 注释中包含所有这些代码,以便将所有内容集中在一个位置。
我怎样才能做到这一点?
经过数小时的搜索,我找到了答案,我希望这可以帮助其他任何人寻找比实体生命周期和错误列类型更令人满意的解决方案(因为 aTIMESTAMP
是具有特定行为的特定类型,而不仅仅是存储datetime
值)
您需要做的就是添加
* @ORM\Column(type="datetime", nullable=false)
* @ORM\Version
到您的注释和 Doctrine 都将创建一个TIMESTAMP
列,DEFAULT CURRENT_TIMESTAMP
然后将实际表值作为有效\DateTime
对象返回。
没有像TIMESTAMP
在 mysql 中使用 Doctrine 这样的东西。但是,我自己修复了它,但必须对其进行测试:
Doctrine\DBAL\Types\TimestampType.php
TimeType.php
到TimestampType.php
Doctrine\DBAL\Types\Type.php
getTimestampTypeDeclarationSQL
的函数Doctrine\DBAL\Platforms\AbstractPlatform.php
TIMESTAMP
我曾经yaml
创建我的实体和代理,所以使用yaml
:
type: timestamp
我现在要测试这个“修复”/“解决方法”。我会告诉你。
正如Daniel Criconet所建议的,
@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
将使相应 MySQL 表中的特定列变为TIMESTAMP
而不是DATETIME
.
对于 YAML 版本,请参阅原始答案。
/**
* @var \DateTime
* @ORM\Column(type="datetime", columnDefinition="timestamp default current_timestamp")
*/
protected $createdAt;
/**
* @var \DateTime
* @ORM\Column(type="datetime", columnDefinition="timestamp default current_timestamp on update current_timestamp")
*/
protected $updatedAt;
@Polichism 提供了正确的逻辑,但补丁未被接受。相反,用户被指示添加自定义类型。我通过结合实现了这一点:
最终版本可以在 GitHub 上找到:
注意:我已经链接到特定的提交,以确保在以后删除文件时链接仍然有效。使用历史记录检查更新的版本。
/** @ORM\Column(type="datetime", nullable=false ) */
protected $created;
这将创建时间戳并返回 datetime 对象
public function __construct()
{
$this->created = new \DateTime();
}
/**
* @Column(type="datetime", options={"default": 0})
* @version=true
*/
private $data;
像这样创建sql:
data TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
在 2.5.4 版本上测试
@ORM\Version 仅适用于每个实体的一个属性,因此如果您需要在表中拥有多个时间戳字段,则它不是一种选择。