12

我正在寻找一种使用TIMESTAMP而不是DATETIMEMySql 来制作学说的方法。

另外我需要设置ON UPDATE CURRENT_TIMESTAMPCURRENT_TIMESTAMP作为默认值。

我希望有可能在 PHP 注释中包含所有这些代码,以便将所有内容集中在一个位置。

我怎样才能做到这一点?

4

8 回答 8

24

经过数小时的搜索,我找到了答案,我希望这可以帮助其他任何人寻找比实体生命周期和错误列类型更令人满意的解决方案(因为 aTIMESTAMP是具有特定行为的特定类型,而不仅仅是存储datetime值)

您需要做的就是添加

 * @ORM\Column(type="datetime", nullable=false)
 * @ORM\Version

到您的注释和 Doctrine 都将创建一个TIMESTAMP列,DEFAULT CURRENT_TIMESTAMP然后将实际表值作为有效\DateTime对象返回。

CTOP(原始海报的学分)

于 2014-09-17T10:41:01.247 回答
4

没有像TIMESTAMP在 mysql 中使用 Doctrine 这样的东西。但是,我自己修复了它,但必须对其进行测试:

  • 创建一个文件:Doctrine\DBAL\Types\TimestampType.php
  • 将代码从复制TimeType.phpTimestampType.php
  • 将代码中的“时间”重命名为“时间戳”
  • 创建一个新常量,并将时间戳添加到类型映射中:Doctrine\DBAL\Types\Type.php
  • 创建调用getTimestampTypeDeclarationSQL的函数Doctrine\DBAL\Platforms\AbstractPlatform.php
  • 在那个函数中,返回TIMESTAMP

我曾经yaml创建我的实体和代理,所以使用yaml

type: timestamp

我现在要测试这个“修复”/“解决方法”。我会告诉你。

于 2012-11-16T09:08:20.910 回答
4

正如Daniel Criconet所建议的,

@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

将使相应 MySQL 表中的特定列变为TIMESTAMP而不是DATETIME.

对于 YAML 版本,请参阅原始答案

于 2017-05-30T17:58:27.533 回答
3
/**
 * @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;
于 2019-07-30T23:17:29.163 回答
2

@Polichism 提供了正确的逻辑,但补丁未被接受。相反,用户被指示添加自定义类型。我通过结合实现了这一点:

最终版本可以在 GitHub 上找到:

注意:我已经链接到特定的提交,以确保在以后删除文件时链接仍然有效。使用历史记录检查更新的版本。

于 2015-01-04T20:23:05.270 回答
1
/** @ORM\Column(type="datetime", nullable=false ) */
    protected $created;

这将创建时间戳并返回 datetime 对象

 public function __construct()
        {
            $this->created = new \DateTime();

        }
于 2015-05-30T13:59:42.683 回答
0

/** * @Column(type="datetime", options={"default": 0}) * @version=true */ private $data;

像这样创建sql: data TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL

在 2.5.4 版本上测试

于 2017-03-25T21:07:16.817 回答
0

@ORM\Version 仅适用于每个实体的一个属性,因此如果您需要在表中拥有多个时间戳字段,则它不是一种选择。

于 2017-03-30T15:14:14.720 回答