具有“0000-00-00 00:00:00”格式的 Doctrine2 默认时间戳?

Doctrine2 default timestamp wtih "0000-00-00 00:00:00" format?

我正在使用 Doctrine2 ORM。我有一个 order table.

Name                | Type       | Attributes                  | Null | Default
--------------------------------------------------------------------------------
order_id            | int        |                             | No   | None
date_created        | timestamp  |                             | No   | CURRENT_TIMESTAMP
date_edited         | timestamp  | on update CURRENT_TIMESTAMP | No   | CURRENT_TIMESTAMP
date_sent           | timestamp  |                             | No   | 0000-00-00 00:00:00
date_cancelled      | timestamp  |                             | No   | 0000-00-00 00:00:00
requested_ship_date | timestamp  |                             | No   | 0000-00-00 00:00:00

我添加了 Timestampable 原则扩展以用于 date_createddate_edited 字段,如下所示:

/**
 * @var \DateTime 
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $date_created;

/**
 * @var \DateTime 
 *
 * @Gedmo\Timestampable(on="update")
 * @ORM\Column(type="datetime")
 */
private $date_edited;

但是,我不确定要为 date_sentdate_cancelled 做什么。我希望它们都默认为 0000-00-00 00:00:00 而不是当前时间。我看到 this workaround 在没有插件的情况下在 Doctrine2 中使用时间戳,但我不希望默认值是这些的当前时间戳。原因是,用户可以 'save' 下订单但不能 'send' 给某人。另外,我显然不希望 date_cancelled 成为当前时间戳。

注意:我不想在数据库中存储空值,所以请不要建议。

提前致谢。

更新

目前我的订单实体中的其余三个字段都有这个。

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime", options={"default":"0000-00-00 00:00:00"})
 * @ORM\Version
 */
private $date_sent;

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime", options={"default":"0000-00-00 00:00:00"})
 * @ORM\Version
 */
private $date_cancelled;

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime", options={"default":"0000-00-00 00:00:00"})
 * @ORM\Version
 */
private $requested_ship_date;

出于某种原因,当我尝试更新 requested_ship_date 字段时,它最终变成了“0000-00-00 00:00:00”。我将 date_sentdate_cancelled 字段留空,它们更新为 我的本地时间,而不是 UTC 时间 。但是,date_createddate_edited 字段将更新为 UTC 时间的当前时间(我想要它)。

基本上,当我保存订单时,它看起来像第一行,但我希望它看起来像第二行(假设用户请求的发货日期为 2015 年 6 月 8 日)。

order_id | date_created        | date_edited         | date_sent           | date_cancelled      | requested_ship_date
-----------------------------------------------------------------------------------------------------------------------
1        | 2015-06-05 12:00:00 | 2015-06-05 12:00:00 | 2015-06-05 07:00:00 | 2015-06-05 07:00:00 | 0000-00-00 00:00:00  
1        | 2015-06-05 12:00:00 | 2015-06-05 12:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 2015-06-08 00:00:00  

我在我的 index.php 文件中设置了时区 date_default_timezone_set('Zulu');。我不会在其他任何地方重置时区。

好的,我找到了一个疯狂的解决方法,但老实说我找不到更好的解决方案。所以,对于任何和我一样陷入困境的人,不用客气,哈哈。

一、规则:

  • date_created = 仅在创建时更新

  • date_edited = 每次更新都会更新

  • date_sent = 当用户点击 "submit" 而不是 "save"

  • 时更新
  • date_cancelled = 当用户决定取消订单时更新

  • requested_ship_date = 创建新订单时需要,这是客户希望订单发货的日期。

我的订单实体中的一些代码。

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime")
 * @Gedmo\Timestampable(on="create")
 */
private $date_created;

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime")
 * @Gedmo\Timestampable(on="update")
 */
private $date_edited;

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime", options={"default":"0000-00-00 00:00:00"})
 */
private $date_sent;

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime", options={"default":"0000-00-00 00:00:00"})
 */
private $date_cancelled;

/**
 * @var \DateTime 
 *
 * @ORM\Column(type="datetime")
 * @Gedmo\Timestampable(on="change", field="requested_ship_date")
 */
private $requested_ship_date;


/*
 * Constructor
 */
public function __construct()
{
    if (!$this->date_sent) $this->date_sent = new DateTime("0000-00-00 00:00:00", new DateTimeZone("Zulu"));
    if (!$this->date_cancelled) $this->date_cancelled = new DateTime("0000-00-00 00:00:00", new DateTimeZone("Zulu"));
}

/**
 * Updates time sent 
 *
 * @return Order
 */
public function send()
{
    $this->date_sent = new DateTime("now");

    return $this;
}

/**
 * Updates time cancelled
 *
 * @return Order
 */
public function cancel()
{
    $this->date_cancelled = new DateTime("now");

    return $this;
}

解释:

我没有更改我在订单中设置数据库列的方式 table。我尝试将 @Gedmo\Timestampable 插件用于我的 date_sentdate_cancelled 字段,但无法正常工作。我注意到由于某些奇怪的原因,时区已关闭,所以我在构造函数中手动设置它们。重要的是不要自动设置它,否则您将覆盖以前设置的值。由于某种我不知道的原因,如果不使用 @Gedmo\Timestampable 插件,我将无法使 requested_ship_date 字段工作。如果我把它拿出来,我尝试使用 Doctrines type="datetime" 的每个设置只会导致列等于 0000-00-00 00:00:00.

如果有人有任何问题,请告诉我。在我弄清楚之前,我基本上不得不研究一下。 date_sentdate_cancelled 字段工作正常,并且在我更新它们时处于正确的时区。