2010-05-30 1039 views
13

我嘗試以下YAML代碼:如何在教條中定義yaml中的當前時間戳?

columns: 
    created_time: 
    type: timestamp 
    notnull: true 
    default: default CURRENT_TIMESTAMP 

在輸出sql語句,字段被視爲日期時間,而不是時間戳,我在那裏不能確定當前的時間戳...

如果我堅持用時間戳來存儲當前時間,如何在yaml中這樣做?

回答

9

你可以在教義使用「Timestampable」的功能,如:

actAs: 
    Timestampable: 
    created: 
     name: created_time 
    updated: 
     disabled: true 
columns: 
    created_time: 
    type: timestamp 
    notnull: true 
13

注意DEFAULT CURRENT_TIMESTAMP不起作用一樣Timestampable,這樣的話你不能盲目換一個其他的。

  • 首先,前者使用了DB服務器的日期/時間,而後者採用的是學說魔力,在你的web服務器調用PHP的date()函數。換句話說,它們是從兩個完全不同的時鐘源獲取日期/時間的兩種截然不同的方式。如果您使用Timestampable,您的Web服務器運行在與您的數據庫服務器不同的計算機上,並且您不會使用例如「 NTP。

  • 此外,DEFAULT CURRENT_TIMESTAMP正對錶定義使得一個更加一致的數據庫模型恕我直言,因爲無論你怎麼插入的數據(例如,數據庫引擎的命令行中運行INSERT S),你會始終在列上獲取當前日期/時間。

順便說一句,我也在尋找一個答案在最初的問題中提到的CURRENT_TIMESTAMP問題,因爲這是(由於上述原因),我的首選保持「時間戳」列的方式。

+0

這裏是我的解決方案:http://stackoverflow.com/a/37924640/1668200 – 2016-06-20 14:11:46

-12

您可以使用:

default: '<?php echo date('Y-m-d H:i:s') ?>' 
16

如果你願意犧牲一些便攜性(見description of columnDefinition attribute)爲使用MySQL的自動初始化TIMESTAMP(見MySQL timestamp initialization)的能力,那麼你可以使用以下命令:

YAML:

created_time: 
    type: datetime 
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

譯註:

@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") 
+0

嗨j0k,謝謝你的回答。由於我無法讓它與您的解決方案一起工作,所以提出了一個新的話題:http://stackoverflow.com/questions/17208388/symfony-1-4-doctrine-1-yalm-cannot-define-default-timestamp-value – xtrm 2013-06-20 08:07:55

0
/** 
* @var int 
* @ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") 
*/ 
protected $created; 

運行./vendor/bin/doctrine-module orm:schema-tool:update --force

更新數據庫模式...數據庫模式更新成功! 「1」 查詢被執行

並運行./vendor/bin/doctrine-module orm:validate-schema

[映射] OK - 映射文件是正確的。[數據庫]失敗 - 數據庫架構與當前映射文件不同步。

失敗用於同步出現

+0

警告!這是很好的答案,當你不會從PHP更新你的數據庫時,但是確實需要使用遷移等更新結構! – 2015-03-30 11:51:48

0

對不起necroposting。 但我遇到同樣的問題。有教條2和postgreSql的解決方案。我已經使用Gemdo延伸和補充如下字符串:

$evm = new \Doctrine\Common\EventManager(); 

     $timestampableListener = new \Gedmo\Timestampable\TimestampableListener; 
     $timestampableListener->setAnnotationReader($cachedAnnotationReader); 
     $evm->addEventSubscriber($timestampableListener); 

YAML:

created: 
    type: date 
    options: 
     default: 0 
     nullable: true 
    gedmo: 
     timestampable: 
      on: create 
updated: 
    type: datetime 
    options: 
     default: 0 
     nullable: true 
    gedmo: 
     timestampable: 
      on: update 

轉儲-SQL:

ALTER TABLE users ADD created DATE DEFAULT CURRENT_DATE NOT NULL; 
ALTER TABLE users ADD updated TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL; 
1

我建議不要使用"default"的時間戳的。

它會在你的應用程序中帶來不可預測的狀態。 此視頻(PHP UK Conference 2016 - Marco Pivetta - Doctrine ORM Good Practices and Tricks)提供了有關此主題的更多信息。 我建議你通過它並創建一個命名構造函數。

public function createTimestamp(string $priority, int $priorityNormalized) 
{ 
    $this->priority = $priority; 
    $this->priorityNormalized = $priorityNormalized; 
} 

我建議是無國籍的,祝你好運!