【发布时间】:2015-05-05 14:14:05
【问题描述】:
由于某些原因,我需要有带有TIMESTAMP 字段的表。
我创建了自己的时间戳类型 (Doctrine\DBAL\Types\Type),它工作正常。
但是当我尝试更新我的数据库结构时,我得到了这个。
命令行
ede80:~>php app/console doctrine:schema:update --force --complete
Updating database schema...
[Doctrine\DBAL\Exception\DriverException]
An exception occurred while executing 'ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp DEFAULT NULL'
SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'DATE_CREATION'
SQL 查询
如果我在数据库上执行以下查询,我可以工作:
ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp DEFAULT CURRENT_TIMESTAMP
ORM.YML
但是当我尝试在MyTable.orm.yml 中更改它时,像这样:
dateCreation:
type: timestamp
nullable: true
column: DATE_CREATION
options:
default: CURRENT_TIMESTAMP
执行的查询是
ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp DEFAULT 'CURRENT_TIMESTAMP'
它失败了。
如何设置一个有效的默认值,以便我的数据库结构可以是最新的?
我已经尝试将options: default 设置为0、NULL、CURRENT_TIMESTAMP、00:00:01...
PHP 5.3.3 MySQL 5.1.63
这是时间戳类型
我认为 convert*() 不太好。
<?php
namespace CNAMTS\PHPK\CoreBundle\Doctrine\Type;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
/**
*/
class Timestamp extends Type
{
const TIMESTAMP = 'timestamp';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return $platform->getDoctrineTypeMapping('TIMESTAMP');
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return ($value === null) ? 0 : new \DateTime($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return ($value === null) ? 0 : $value->format(\DateTime::W3C);
}
public function getName()
{
return self::TIMESTAMP;
}
}
【问题讨论】:
-
为什么不想使用 DATETIME 类型? stackoverflow.com/questions/409286/datetime-vs-timestamp
-
我已经阅读了这个页面,但是我不能,不幸的是,这是我工作的标准。我知道,这很愚蠢。
-
您可以尝试将您的属性定义为 Doctrine 的
datetime类型,也许它会起作用,因为datetime在 PostgreSQL 中被解释为TIMESTAMP。 -
感谢您的提示,我有效地尝试过,但它们存储为
Datetime字段,我需要Timestamp字段。我实际上使用 MySQL。
标签: php mysql symfony doctrine-orm timestamp