Symfony 学说时间戳字段

ar3*_*34z 2 php mysql symfony doctrine-orm

我正在尝试为我的 Symfony 项目创建一个timestamp数据库字段类型。我创建了以下数据库类型:

class TimestampType extends Type {

    const TIMESTAMP_TYPE_NAME = 'timestamp';

    /**
     * Gets the SQL declaration snippet for a field of this type.
     *
     * @param array $fieldDeclaration The field declaration.
     * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform The currently used database platform.
     *
     * @return string
     */
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return "TIMESTAMP";
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return $value;
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value;
    }

    /**
     * Gets the name of this type.
     *
     * @return string
     *
     * @todo Needed?
     */
    public function getName()
    {
        return self::TIMESTAMP_TYPE_NAME;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的实体中,我已声明以下属性:

/**
 * @var \DateTime
 * @ORM\Column(name="created", type="timestamp", options={"default":"CURRENT_TIMESTAMP"})
 */
protected $created = null;
Run Code Online (Sandbox Code Playgroud)

一切看起来都不错,但是在运行数据库更新时,出现错误:

An exception occurred while executing 'ALTER TABLE question CHANGE created created TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP' NOT NULL COMMENT '(DC2Type:timestamp)'':  
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created'  
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我的默认值被封装在单引号中。字段不会发生这种情况datetime,但随后我收到错误,默认值无效。

有什么办法可以让 Symfony 接受一个timetamp字段CURRENT_TIMESTAMP作为默认值吗?

我在自定义类型中尝试了以下操作,通过注释掉 Symfony 添加的附加查询:

public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
    return "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '(DC2Type:" . self::TIMESTAMP_TYPE_NAME . ")' #--";
}
Run Code Online (Sandbox Code Playgroud)

这可行,但现在 Symfony 总是认为它需要更新我的表,并对它认为需要更新的每个表运行查询。

我的目标是如果我运行本机插入查询,则在数据库中有一个时间戳。我知道可以使用它们来完成HasLifecycleCallbacks并且我已经配置了它们,但我想在某些时候避免 ORM 并使用本机查询。

任何帮助,将不胜感激。:)

Nic*_*ick 7

我见过的一个有趣的小技巧是这样的(您不需要创建的数据库类型,只需更新映射):

/**
 * @ORM\Column(type="datetime", nullable=false)
 * @ORM\Version
 * @var \DateTime
 */
protected $created = null;
Run Code Online (Sandbox Code Playgroud)

幕后发生的事情是,Doctrine 最终会将日期时间转换为时间戳,因为它与 组合@version,并且应该添加默认时间戳架构更改。

话虽如此,这并不是这个功能的预期用途(http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-version),我会好奇您进行的后续更新查询会发生什么。

我知道您正在寻找在 MySQL 中设置的默认值,以便您可以在 Doctrine 之外运行查询,但为我添加默认时间戳的最清晰方法始终是将其添加到对象的构造函数中:

public function __construct()
{
    $this->created = new \DateTime();
}
Run Code Online (Sandbox Code Playgroud)