遵循 Doctrine 指南,我了解如何为实体设置默认值,但如果我想要日期/时间戳怎么办?
我的问题是我的数据库在字段上默认为 NOW() 但是当我使用 Doctrine 插入记录时,值是 null 或空白,但插入的其余部分发生了。
此外,由于 Doctrine 说要将默认值声明为 const,这也会产生问题。
建议?
遵循 Doctrine 指南,我了解如何为实体设置默认值,但如果我想要日期/时间戳怎么办?
我的问题是我的数据库在字段上默认为 NOW() 但是当我使用 Doctrine 插入记录时,值是 null 或空白,但插入的其余部分发生了。
此外,由于 Doctrine 说要将默认值声明为 const,这也会产生问题。
建议?
好的,我找到了解决方案:
prePersist
选项就是我正在做的事情。
确保在注释中定义
<?php
/** @Entity
* @HasLifecycleCallbacks
*/
class User
这是他们提供的功能示例
/**
* @PrePersist
*/
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
如果你像我一样使用 ORM
<?php
/** @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class User
这是他们提供的功能示例
/**
* @ORM\PrePersist
*/
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
根据我的经验,最好将所有内容都放在您的实体中,而不是试图强迫您的数据库绕过 ORM。
<?php
namespace Phill\PaffordBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Stack
* @ORM\Table()
*/
class Stack
{
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
* @ORM\Column(type="datetime")
*/
private $startDate;
public function __construct()
{
$this->startDate = new \DateTime();
}
}
为了准确地拥有NOW()
你可以扩展Doctrine\DBAL\Types\DateTimeType
.
其他方法:
class DateTimeNow
{
public function format()
{
return 'NOW()';
}
}
然后你可以使用$entity->setFieldDatetime(DateTimeNow())
而不是$entity->setFieldDatetime(new Datetime())
.
注意:该方法format()
由 Doctrine 自动调用。
试试这个:
/**
* @var \DateTime
*
* @Column(name="created", type="datetime", nullable=false)
*/
private $created;
function __construct()
{
$this->created = new \DateTime();
}
$value
您分配给字段的任何内容created
都必须能够处理此调用:
$value->format('Y-m-d H:i:s');
经测试可与 Doctrine 2.5.4 一起使用
注意:以上在创建时有效,但默认情况下不在更新时有效——您必须在进行更新或查看时手动设置created
属性new \DateTime()
doStuffOnPrePersist
/** @PrePersist */
public function doStuffOnPrePersist()
{
$this->created = date('Y-m-d H:i:s');
}
您可以使用 TimestampableEntity Trait 在您的实体中自动创建 created_at 和 updated_at 字段;
首先安装学说扩展;
composer require gedmo/doctrine-extensions
其次将特征添加到您的实体类中;
use Gedmo\Timestampable\Traits\TimestampableEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
*/
class Project
{
use TimestampableEntity;
对于 PostgreSQL,您应该只能够传递now
字段的字符串值以获取时间戳以发挥作用。
#[ORM\Column(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
private $createdAt;
#[ORM\Column(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'], columnDefinition: "DATETIME on update CURRENT_TIMESTAMP")]
private $modifiedAt;
这是我发现的,我能够获得“ON UPDATE CURRENT_TIMESTAMP()”,但是该列变为可为空,在我看来这是一个更好的权衡。