16

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

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

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

建议?

4

7 回答 7

27

好的,我找到了解决方案:

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');
}
于 2012-12-14T14:28:36.333 回答
9

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

}
于 2014-08-06T22:30:31.443 回答
7

为了准确地拥有NOW()你可以扩展Doctrine\DBAL\Types\DateTimeType.

其他方法:

class DateTimeNow
{
    public function format() 
    {
        return 'NOW()';
    }
}

然后你可以使用$entity->setFieldDatetime(DateTimeNow())而不是$entity->setFieldDatetime(new Datetime()).
注意:该方法format()由 Doctrine 自动调用。

于 2015-04-01T06:52:41.340 回答
3

试试这个:

/**
 * @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 代码行

经测试可与 Doctrine 2.5.4 一起使用

注意:以上在创建时有效,但默认情况下不在更新时有效——您必须在进行更新或查看时手动设置created属性new \DateTime()doStuffOnPrePersist

/** @PrePersist */
public function doStuffOnPrePersist()
{
    $this->created = date('Y-m-d H:i:s');
}
于 2015-11-16T16:12:08.477 回答
1

您可以使用 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;
于 2019-06-25T20:16:57.370 回答
0

对于 PostgreSQL,您应该只能够传递now字段的字符串值以获取时间戳以发挥作用。

于 2012-12-12T23:53:16.637 回答
0
#[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()”,但是该列变为可为空,在我看来这是一个更好的权衡。

于 2021-12-27T08:20:45.070 回答