Doctrine2 - 类型时间戳 - 默认值

时间:2015-05-05 14:14:05

标签: php mysql symfony doctrine-orm timestamp

出于某些原因,我需要有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设置为0NULLCURRENT_TIMESTAMP00: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;
    }
}

4 个答案:

答案 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