我嘗試以下YAML代碼:如何在教條中定義yaml中的當前時間戳?
columns:
created_time:
type: timestamp
notnull: true
default: default CURRENT_TIMESTAMP
在輸出sql語句,字段被視爲日期時間,而不是時間戳,我在那裏不能確定當前的時間戳...
如果我堅持用時間戳來存儲當前時間,如何在yaml中這樣做?
我嘗試以下YAML代碼:如何在教條中定義yaml中的當前時間戳?
columns:
created_time:
type: timestamp
notnull: true
default: default CURRENT_TIMESTAMP
在輸出sql語句,字段被視爲日期時間,而不是時間戳,我在那裏不能確定當前的時間戳...
如果我堅持用時間戳來存儲當前時間,如何在yaml中這樣做?
你可以在教義使用「Timestampable」的功能,如:
actAs:
Timestampable:
created:
name: created_time
updated:
disabled: true
columns:
created_time:
type: timestamp
notnull: true
注意DEFAULT CURRENT_TIMESTAMP
不起作用一樣Timestampable,這樣的話你不能盲目換一個其他的。
首先,前者使用了DB服務器的日期/時間,而後者採用的是學說魔力,在你的web服務器調用PHP的date()函數。換句話說,它們是從兩個完全不同的時鐘源獲取日期/時間的兩種截然不同的方式。如果您使用Timestampable,您的Web服務器運行在與您的數據庫服務器不同的計算機上,並且您不會使用例如「 NTP。
此外,DEFAULT CURRENT_TIMESTAMP
正對錶定義使得一個更加一致的數據庫模型恕我直言,因爲無論你怎麼插入的數據(例如,數據庫引擎的命令行中運行INSERT
S),你會始終在列上獲取當前日期/時間。
順便說一句,我也在尋找一個答案在最初的問題中提到的CURRENT_TIMESTAMP
問題,因爲這是(由於上述原因),我的首選保持「時間戳」列的方式。
您可以使用:
default: '<?php echo date('Y-m-d H:i:s') ?>'
如果你願意犧牲一些便攜性(見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")
嗨j0k,謝謝你的回答。由於我無法讓它與您的解決方案一起工作,所以提出了一個新的話題:http://stackoverflow.com/questions/17208388/symfony-1-4-doctrine-1-yalm-cannot-define-default-timestamp-value – xtrm 2013-06-20 08:07:55
/**
* @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 - 映射文件是正確的。[數據庫]失敗 - 數據庫架構與當前映射文件不同步。
但失敗用於同步出現
警告!這是很好的答案,當你不會從PHP更新你的數據庫時,但是確實需要使用遷移等更新結構! – 2015-03-30 11:51:48
對不起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;
我建議不要使用"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;
}
我建議是無國籍的,祝你好運!
這裏是我的解決方案:http://stackoverflow.com/a/37924640/1668200 – 2016-06-20 14:11:46