我正在寻找一种方法,在MySql中使用TIMESTAMP
而不是DATETIME
来制定条令。
另外,我需要将ON UPDATE CURRENT_TIMESTAMP
和CURRENT_TIMESTAMP
设置为默认值。
我希望有可能将所有这些代码都放在PHP注释中,以便将所有内容放在一个中心位置。
我该怎么做?
经过数小时的搜索,我找到了答案,我希望这能帮助其他人寻找比实体生命周期和错误列类型更令人满意的解决方案(因为TIMESTAMP
是一种特殊类型,其特定行为不仅仅是存储datetime
值)
你所需要做的就是添加
* @ORMColumn(type="datetime", nullable=false)
* @ORMVersion
到您的注释,Doctrine将创建一个具有DEFAULT CURRENT_TIMESTAMP
的TIMESTAMP
列,然后将实际表值作为有效的DateTime
对象返回。
CTOP(归功于原始海报)
没有像在带有Doctrine的mysql中使用TIMESTAMP
这样的东西。然而,我自己修复了它,但必须测试它:
- 创建文件:
DoctrineDBALTypesTimestampType.php
- 将代码从
TimeType.php
复制到TimestampType.php
- 将代码中的"Time"重命名为"Timestamp"
- 创建一个新的常量,并将时间戳添加到
DoctrineDBALTypesType.php
中的typesmap - 在
DoctrineDBALPlatformsAbstractPlatform.php
中创建名为getTimestampTypeDeclarationSQL
的函数 - 在该函数中,返回
TIMESTAMP
我已经使用yaml
创建实体和代理,所以在yaml
:中使用
type: timestamp
我现在要测试这个"修复"/"变通"。我会告诉你的。
根据 Daniel Criconet的建议
@ORMColumn(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
将使相应MySQL表中的特定列变为CCD_ 21而不是CCD_。
对于YAML版本,请参阅原始答案。
/**
* @var DateTime
* @ORMColumn(type="datetime", columnDefinition="timestamp default current_timestamp")
*/
protected $createdAt;
/**
* @var DateTime
* @ORMColumn(type="datetime", columnDefinition="timestamp default current_timestamp on update current_timestamp")
*/
protected $updatedAt;
@Policism提供了正确的逻辑,但补丁没有被接受。相反,用户被引导添加自定义类型。我已经通过组合实现了这一点:
- @Policism补丁中的逻辑
- 条令推荐的自定义映射类型代码
- 此处提供Zf2应用程序配置说明
最终版本可以在GitHub:上找到
- 时间戳类
- 参见配置的"条令"部分
注意:我已经链接到特定的提交,以确保在以后删除文件时链接仍然有效。使用历史记录检查更新的版本。
/** @ORMColumn(type="datetime", nullable=false ) */
protected $created;
这将创建时间戳并返回日期时间对象
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只适用于每个实体的一个属性,因此如果您需要在表中有多个时间戳字段,则不能选择它。