nas*_*asy 12 php datetime timestamp symfony doctrine-orm
我不知道哪个是在数据库中存储时间戳的最佳方法.我想用小时分钟和秒来存储整个日期,但它只存储日期(例如2012-07-14),我想存储2012-07-14 HH:MM:SS.我正在使用dateTime对象.这是代码:
在控制器中:
$user->setCreated(new \DateTime());
Run Code Online (Sandbox Code Playgroud)
在实体中:
/**
* @var date $created
*
* @ORM\Column(name="created", type="date")
*/
private $created;
Run Code Online (Sandbox Code Playgroud)
将日期和时间分别存储在数据库中更好吗?或者更好地存储所有像YYYY-MM-DD HH:MM:SS?然后,我将比较日期并计算剩余时间,因此这对于稍后简化操作非常重要.所以你怎么看 ?有人能帮助我吗?
Gor*_*don 12
如果数据库支持该类型,则在数据库中存储时间戳的最佳方法显然是使用timestamp列.由于您可以在创建时将该列设置为自动更新,因此您甚至不必为其提供setter.
Doctrine 2有一个Timestampable行为扩展,它也完全来自用户端:
时间戳行为将自动更新实体或文档上的日期字段.它通过注释工作,可以更新创建,更新甚至特定属性值更改的字段.
特征:
- 自动预定日期字段更新创建,更新甚至记录属性更改
- ORM和ODM支持使用相同的侦听器
- 属性的特定注释,不需要任何接口
- 可以对特定属性或关系更改为特定值做出反应
- 可以与其他行为嵌套
- 注释,Yaml和Xml映射支持扩展
有了这种行为,您需要做的就是将注释更改为
/**
* @var datetime $created
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
*/
private $created;
Run Code Online (Sandbox Code Playgroud)
然后你不需要调用setCreated你的代码.首次创建实体时,将自动设置该字段.
Mic*_*ick 11
为了在不使用doctrine的Timestampable行为的情况下存储创建日期,您还可以通过在声明类时添加注释来使用LifeCycle Callbacks@ORM\HasLifecycleCallbacks.以下是在您的情况下在数据库中存储YYYY-MM-DD HH:MM:SS的方法.
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="yourTable")
*/
class Nasy
{
/**
* @ORM\Column(name="created", type="string", length=255)
*/
private $created;
/**
* @ORM\PrePersist
*/
public function doStuffOnPrePersist()
{
$this->created = date('Y-m-d H:i:s');
}
Run Code Online (Sandbox Code Playgroud)
最后,如果您遇到时区问题,可以在登录时使用事件监听器在会话中设置时区.马特Drolette做了自己的博客真棒工作在这里.无论如何,您可能总是将时间存储在服务器所在的时区中.然后使用会话中设置的时区向用户显示正确的时间.祝好运.
在@ Pratt的回答基础上,我做到了这一点.我的实体中有2个字段用于创建,1个用于修改.
/**
* @ORM\Column(type="datetime")
*/
protected $created_at;
/**
* @ORM\Column(type="datetime")
*/
protected $modified_at;
Run Code Online (Sandbox Code Playgroud)
然后使用注释我在prePersist和preUpdate上调用它
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps()
{
$this->setModifiedAt(new \DateTime(date('Y-m-d H:i:s')));
if($this->getCreatedAt() == null)
{
$this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
}
}
Run Code Online (Sandbox Code Playgroud)
该函数可以分为两个函数,一个用于创建一个用于更新,但这是有效的,所以我认为没有理由在正常工作时使用额外的代码.