2015-05-05 64 views
2

由於某些原因,我需要有TIMESTAMP字段的表。Doctrine2 - 類型時間戳 - 默認值

我創建了我自己的時間戳類型(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: default0NULLCURRENT_TIMESTAMP00:00:01 ...

PHP 5.3.3 MySQL的63年5月1日

這裏是timestamp類型

我認爲轉換*()並不好。

<?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

爲什麼你不想使用DATETIME類型? http://stackoverflow.com/questions/409286/datetime-vs-timestamp –

+0

我已經讀過這個頁面,但是我不能,這是我工作的一個標準,不幸的是......我知道,這很愚蠢。 – Ulti

+0

你可以嘗試將你的屬性定義爲Doctrine的'datetime'類型,也許它會工作,因爲在PostgreSQL中'datetime'被解釋爲'TIMESTAMP'。 –

回答

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。陽明海運

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(); 
} 

這就是我做它:-) THX工作的所有您的幫助!

-2

您可以嘗試刪除CURRENT_TIMESTAMP附近的引號。 sql查詢執行得很好,沒有引號。

ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp [NULL|NOT NULL] DEFAULT CURRENT_TIMESTAMP 
+1

如何?我自己不執行這些查詢,我讓Doctrine處理它。 – Ulti

+0

你可以發佈你的時間戳類型嗎? – ediraphael

+0

如果你使用symfony,爲什麼你不像這樣聲明你的TIMESTAMP呢? 字段: myDate: 類型:日期時間 版本:true – ediraphael

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" 
+0

Thx對於該提示,我不知道。 它可以在我的情況下工作,但我至少需要2個TIMESTAMP字段,不幸的是,由於一些DBMS原因(我使用MySQL 5.1.63,這個限制已經在MySQL 5.6.5中被刪除) 。 所以我會繼續我的第一個解決方法: -/ 但不錯的嘗試! – Ulti

1

不知道我的答案仍然有幫助,但也許它會幫助未來的人。我們這樣做只是通過映射,沒有額外的類型(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

希望有幫助!

+0

我對這個解決方案有問題。學說試圖在插入/更新時將「空白」保存到日期字段。 – Acuariano