Symfony doctrine timestamp字段

时间:2015-06-25 16:36:57

标签: 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;
    }
}

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

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

一切看起来都不错,但在运行数据库更新时,我收到错误:

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'  

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

有什么方法可以让Symfony接受timetamp字段作为默认值{?1}}?

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

CURRENT_TIMESTAMP

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

如果我运行本机插入查询,我的目标是在数据库中设置时间戳。我知道可以使用public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) { return "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '(DC2Type:" . self::TIMESTAMP_TYPE_NAME . ")' #--"; } 完成它并且我已经配置了它们,但我想在某些点避免使用ORM并使用本机查询。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

我知道您正在寻找在MySQL中设置的默认设置,因此您可以在Doctrine之外运行查询,但为我添加默认时间戳的最明确方法一直是将其添加到对象中#39 ; s构造函数:

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