关于php:Symfony doctrine timestamp字段

Symfony doctrine timestamp field

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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;
    }
}

在我的实体中,我已声明以下财产:

1
2
3
4
5
/**
 * @var \DateTime
 * @ORM\Column(name="created", type="timestamp", options={"default":"CURRENT_TIMESTAMP"})
 */

protected $created = null;

看起来不错,但是运行数据库更新时,我会收到一个错误:

1
2
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字段,其中CURRENT_TIMESTAMP作为默认值?

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

1
2
3
4
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
    return"TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '(DC2Type:" . self::TIMESTAMP_TYPE_NAME .")' #--";
}

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

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

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


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

1
2
3
4
5
6
/**
 * @ORM\Column(type="datetime", nullable=false)
 * @ORM\Version
 * @var \DateTime
 */

protected $created = null;

幕后发生的事情是,由于日期时间与@version组合在一起,因此该理论最终会将日期时间强制转换为时间戳,并且应该添加默认的时间戳模式更改。

尽管如此,这并不是这个功能的预期用途(http://distrine orm.readthedocs.org/en/latest/reference/annotations-reference.html annref版本),我想知道您在随后的更新查询中会发生什么。

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

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