Symfony2,设置datetime字段的默认值

时间:2014-03-20 09:55:46

标签: php symfony datetime doctrine-orm

所以,我在我的实体中有一个类似的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...

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

7 个答案:

答案 0 :(得分:8)

你是在构造函数中完成的。

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

在表单构建器中将其设置为:

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

或在您的实体构造函数

答案 3 :(得分:1)

您可以通过向定义添加选项来实现,我认为这是一个更好的可读性解决方案。此外,在使用构造函数时,您应该通过额外调用将​​默认值添加到现有行。

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

答案 4 :(得分:0)

该属性只能是常数值。

如果您不希望每次都$myEntity->setTimestamp(new \DateTime('now'));,那么您可以使用 doctrine lifecycle callbacks 来处理它。

答案 5 :(得分:0)

如果要为$ timestamp设置默认值,请在实体中创建_contruct,这样每次声明此实体的对象时,都会自动设置$ timestamp的值。

如果您不想这样做,那么您必须在控制器中设置值,然后在数据库中保留值。 Symfony2期望DB表的每个字段都有一个值。

答案 6 :(得分: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"})