Symfony2,设置datetime字段的默认值

3
所以,我在实体中有一个DateTime字段,就像这样:
/**
     * @var \DateTime
     *
     * @ORM\Column(name="timestamp", type="datetime")
     */
    private $timestamp;

每次我向数据库插入内容时,我都会执行以下操作:$myEntity->setTimestamp(new \DateTime('now')); 因此,我想在实体的字段中设置默认值为NOW,但是当我尝试这样做时:
/**
 * @var \DateTime
 *
 * @ORM\Column(name="timestamp", type="datetime")
 */
private $timestamp = new \DateTime('now');

在使用doctrine:schema:update更新我的基础后,我遇到了这个错误:PHP Parse error: syntax error, unexpected 'new' (T_NEW) in...

我该如何为此字段设置默认值?我不想每次使用实体时都要设置时间戳... 谢谢!


1
在 __construct() 中设置 $timestamp - Debflav
7个回答

9

你可以在构造函数中完成这个操作。

public function __construct(){
    $this->timestamp(new \DateTime());
}

6

LifecycleCallbacks 方法:

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * Example
 *
 * @ORM\Table(name="examples")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Example
{

    // ...

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="create_at", type="datetime", nullable=false)
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable=false)
     */
    private $updatedAt;

    // ...

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     * @ORM\PrePersist
     * @return Example
     */
    public function setCreatedAt()
    {

        if(!$this->createdAt){
            $this->createdAt = new \DateTime();
        }

        return $this;
    }

    // ...

    /**
     * Set updatedAt
     *
     * @param \DateTime $updatedAt
     * @ORM\PrePersist
     * @return Example
     */
    public function setUpdatedAt()
    {
        $this->updatedAt = new \DateTime();

        return $this;
    }

    // ...
}

请注意注释@ORM\HasLifecycleCallbacks和@ORM\PrePersist。 详情请参阅:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-callbacks

1
你可以通过向定义中添加选项来实现,我认为这是更好的可读性解决方案。此外,在使用构造函数时,你应该通过额外的调用来添加现有行的默认值。
@ORM\Column(name="creation_date", type="datetime", options={"default"="CURRENT_TIMESTAMP"})

1

在表单构建器中设置如下:

$builder->add('timestamp', 'date', array(
    'data' => new \DateTime('now')
));

或者在你的实体构造函数中。

0

我正在使用Symfony3,并在orm.xml文件中更新字段和选项以解决此问题。

<field name="updated_from" type="datetime" nullable="true" >
    <options>
        <option name="default">CURRENT_TIMESTAMP</option>
    </options>
</field>

顺便说一下,我也尝试将此注释添加到实体中,但对我没有起作用!例如

@ORM\Column(name="updated", type="datetime", options={"default":"CURRENT_TIMESTAMP"})

0

该属性只能是常量值。

如果你不想每次都执行 $myEntity->setTimestamp(new \DateTime('now'));,那么你可以使用doctrine生命周期回调来处理它。


0
如果您想为$timestamp设置默认值,请在实体中创建一个_construct函数,这样每次声明此实体的对象时,$timestamp的值会自动设置。
如果您不想这样做,则必须在控制器中设置该值,然后将其持久化到数据库中。Symfony2期望DB表的每个字段都有一个值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接