Doctrine - 为实体添加默认时间戳,如NOW()

Phi*_*ord 14 php postgresql entities symfony doctrine-orm

遵循Doctrine准则,我了解如何为实体设置默认值,但如果我想要日期/时间戳怎么办?

我的问题是我的数据库在字段上有一个默认的NOW()但是当我使用Doctrine插入记录时,值为null或空白但插入的其余部分发生了.

此外,由于Doctrine声称将默认值声明为const,这也会产生问题.

建议?

Phi*_*ord 26

好的我找到了解决方案:

prePersist选项是我在做什么.

确保在注释中定义

<?php

/** @Entity 
 *  @HasLifecycleCallbacks 
 */
class User
Run Code Online (Sandbox Code Playgroud)

这是他们提供的功能示例

/** 
 *  @PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}
Run Code Online (Sandbox Code Playgroud)

如果你像我一样使用ORM

<?php

/** @ORM\Entity 
 *  @ORM\HasLifecycleCallbacks 
 */
class User
Run Code Online (Sandbox Code Playgroud)

这是他们提供的功能示例

/** 
 *  @ORM\PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}
Run Code Online (Sandbox Code Playgroud)

  • *`Ymd H:i:s`是正确的日期格式字符串 (2认同)

Dav*_*cum 8

根据我的经验,最好将所有内容放在您的实体中,而不是试图强制您的数据库绕过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();
  }

}
Run Code Online (Sandbox Code Playgroud)

  • 我不同意,原因如下:ORM 可以改变,如果我执行原始 SQL,还有其他原因,但这应该在数据库端处理,至少是为了数据完整性 (2认同)

Ale*_*dre 5

为了精确地NOW()进行扩展Doctrine\DBAL\Types\DateTimeType

其他方法:

class DateTimeNow
{
    public function format() 
    {
        return 'NOW()';
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用$entity->setFieldDatetime(DateTimeNow())代替$entity->setFieldDatetime(new Datetime())
注意:该方法format()由Doctrine自动调用。