出于某些原因,我需要有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
以下是时间戳类型
我认为转换*()并不是那么好。
<?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;
}
}
答案 0 :(得分:2)
我试过了,它对我有用:
dateCreation:
type: datetime
version: true
column: DATE_CREATION
带
"doctrine/orm": "~2.2,>=2.2.3",
"doctrine/doctrine-bundle": "~1.2",
"doctrine/doctrine-fixtures-bundle": "~2.2"
"doctrine/migrations": "dev-master",
"doctrine/doctrine-migrations-bundle": "dev-master"
答案 1 :(得分:2)
不确定我的回答是否仍有帮助,但未来可能会对某人有所帮助。我们这样做的方式只是通过映射,没有额外的类型(Doctrine允许时间戳)。有解决方案:
dateAdd:
type: datetime
column: date_add
columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
options:
default: CURRENT_TIMESTAMP
editDate:
type: datetime
column: date_edit
columnDefinition: TIMESTAMP on update CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
options:
default: CURRENT_TIMESTAMP
列定义确保它将被正确创建,并且options
设置确保在您运行doctrine:schema:validate
时,您将看到它处于同步状态(它用于交叉检查默认值目前的定义)。
同样,如果您希望将这些列设为可为空,则必须更改columnDefinition
并添加nullable: false
。
希望有所帮助!
答案 2 :(得分:0)
以下是表中包含多个时间戳字段的解决方案。
您需要在 AppKernel.php 中定义并添加自己的时间戳类型:
public function boot() {
parent::boot();
/**
* SQL type TIMESTAMP
*/
$em = $this->container->get('doctrine.orm.default_entity_manager');
Doctrine\DBAL\Types\Type::addType('timestamp', 'My\CoreBundle\Doctrine\Type\Timestamp');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('TIMESTAMP', 'timestamp');
}
在您的实体定义中, MyEntity.orm.yml :
dateCreation:
type: timestamp
nullable: false
column: DATE_CREATION
columnDefinition: TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
dateModification:
type: timestamp
nullable: false
column: DATE_MODIFICATION
columnDefinition: TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在实体 MyEntity.php 中,有一个prePersist:
public function doPrePersist()
{
$this->dateCreation = new \DateTime();
}
我是如何让它发挥作用的:-) 谢谢你的帮助!
答案 3 :(得分:-2)
您可以尝试删除CURRENT_TIMESTAMP周围的引号。 sql查询在没有引号的情况下执行得很好。
ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp [NULL|NOT NULL] DEFAULT CURRENT_TIMESTAMP