原则 - 将默认时间戳添加到实体,如 NOW()



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

  • http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/faq.html
我的

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

此外,由于学说将默认值声明为常量,这也会产生问题。

建议?

好的,

我找到了解决方案:

  • https://doctrine-orm.readthedocs.org/en/latest/reference/php-mapping.html?highlight=callback
  • http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#lifecycle-events

prePersist选项是我正在做的事情。

确保在批注中定义

<?php
/** @Entity 
 *  @HasLifecycleCallbacks 
 */
class User

这是他们提供的功能示例

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

如果你像我一样使用 ORM

<?php
/** @ORMEntity 
 *  @ORMHasLifecycleCallbacks 
 */
class User

这是他们提供的功能示例

/** 
 *  @ORMPrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}

根据我的经验,最好将所有内容都放在您的实体中,而不是试图强迫您的数据库绕过 ORM。

<?php
namespace PhillPaffordBundleEntity;
use DoctrineORMMapping as ORM;
/**
 * Stack
 * @ORMTable()
 */
class Stack
{
  /**
   * @var integer
   * @ORMColumn(type="integer")
   * @ORMId
   * @ORMGeneratedValue(strategy="AUTO")
   */
  private $id;
  /**
   * @var DateTime
   * @ORMColumn(type="datetime")
   */
  private $startDate;
  public function __construct()
  {
    $this->startDate = new DateTime();
  }
}

为了准确NOW(),您可以扩展DoctrineDBALTypesDateTimeType

其他方法:

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();
}

分配给created字段的任何$value都必须能够处理此调用:

$value->format('Y-m-d H:i:s');

请参阅相关的教义代码行

经测试可与教义 2.5.4 配合使用

注意:上述内容在创建时有效,但默认情况下不适用于更新 - 您必须在执行更新或查看doStuffOnPrePersist时手动将created属性设置为new DateTime()

/** @PrePersist */
public function doStuffOnPrePersist()
{
    $this->created = date('Y-m-d H:i:s');
}
#[ORMColumn(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
    private $createdAt;
    #[ORMColumn(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'], columnDefinition: "DATETIME on update CURRENT_TIMESTAMP")]
    private $modifiedAt;

这就是我发现的,我能够获得"ON UPDATE CURRENT_TIMESTAMP()",但是该列变为可为空,在我看来这是一个更好的权衡。

您可以使用

时间戳实体特征在实体中自动创建created_at和updated_at字段;

首先安装教义扩展;

composer require gedmo/doctrine-extensions
其次,将

特征添加到实体类中;

use GedmoTimestampableTraitsTimestampableEntity;
    /**
     * @ORMEntity(repositoryClass="AppRepositoryProjectRepository")
     */
    class Project
    {
        use TimestampableEntity;

对于 PostgreSQL,您应该能够传递字段的字符串值 now 来获取时间戳。

最新更新