具有“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_created
和 date_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_sent
和 date_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_sent
和 date_cancelled
字段留空,它们更新为 我的本地时间,而不是 UTC 时间 。但是,date_created
和 date_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_sent
和 date_cancelled
字段,但无法正常工作。我注意到由于某些奇怪的原因,时区已关闭,所以我在构造函数中手动设置它们。重要的是不要自动设置它,否则您将覆盖以前设置的值。由于某种我不知道的原因,如果不使用 @Gedmo\Timestampable
插件,我将无法使 requested_ship_date
字段工作。如果我把它拿出来,我尝试使用 Doctrines type="datetime"
的每个设置只会导致列等于 0000-00-00 00:00:00
.
如果有人有任何问题,请告诉我。在我弄清楚之前,我基本上不得不研究一下。 date_sent
和 date_cancelled
字段工作正常,并且在我更新它们时处于正确的时区。
我正在使用 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_created
和 date_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_sent
和 date_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_sent
和 date_cancelled
字段留空,它们更新为 我的本地时间,而不是 UTC 时间 。但是,date_created
和 date_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_sent
和 date_cancelled
字段,但无法正常工作。我注意到由于某些奇怪的原因,时区已关闭,所以我在构造函数中手动设置它们。重要的是不要自动设置它,否则您将覆盖以前设置的值。由于某种我不知道的原因,如果不使用 @Gedmo\Timestampable
插件,我将无法使 requested_ship_date
字段工作。如果我把它拿出来,我尝试使用 Doctrines type="datetime"
的每个设置只会导致列等于 0000-00-00 00:00:00
.
如果有人有任何问题,请告诉我。在我弄清楚之前,我基本上不得不研究一下。 date_sent
和 date_cancelled
字段工作正常,并且在我更新它们时处于正确的时区。