2015-06-25 38 views
1

我正在嘗試爲我的Symfony項目創建一個timestamp數據庫字段類型。 我已經創建了以下數據庫類型:Symfony主義時間戳字段

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字段,CURRENT_TIMESTAMP作爲默認值?

我試着在我的自定義類型下面,通過註釋掉追加查詢的Symfony補充說:

public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) 
{ 
    return "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '(DC2Type:" . self::TIMESTAMP_TYPE_NAME . ")' #--"; 
} 

這樣的作品,但現在的Symfony始終認爲它需要更新我的表並運行查詢每個表,它認爲它需要更新。

我的目標是在數據庫中有一個時間戳,如果我運行本地插入查詢。我知道這可以使用HasLifecycleCallbacks完成,我已經配置了它們,但我想在某些點避免ORM並使用本機查詢。

任何幫助,將不勝感激。 :)

回答

1

一個有趣的小把戲我所看到的是這個(你不會需要你創建的數據庫類型,只需更新映射):

/** 
* @ORM\Column(type="datetime", nullable=false) 
* @ORM\Version 
* @var \DateTime 
*/ 
protected $created = null; 

幕後會發生什麼情況是,學說會最終將日期時間轉換爲時間戳,因爲它與@version相結合,並應添加默認時間戳記模式更改。因此,這不是該功能的預期用途(http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-version),並且我很好奇在隨後發生的更新查詢時會發生什麼。

我知道你正在尋找在MySQL中設置的默認值,所以你可以在Doctrine之外運行查詢,但爲我添加默認時間戳的最明顯方式一直是將它添加到對象的構造函數中:

public function __construct() 
{ 
    $this->created = new \DateTime(); 
}