我试图为我的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并使用本机查询。
任何帮助将不胜感激。 :)
答案 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();
}