【问题标题】:Symfony2, set default value of datetime fieldSymfony2,设置日期时间字段的默认值
【发布时间】:2014-03-20 09:55:45
【问题描述】:

所以,我的实体中有一个这样的 DateTime 字段:

/**
     * @var \DateTime
     *
     * @ORM\Column(name="timestamp", type="datetime")
     */
    private $timestamp;

每次我在我的数据库中插入一些东西时,我都会这样做:$myEntity->setTimestamp(new \DateTime('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...

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

【问题讨论】:

  • 在 __construct() 中设置 $timestamp

标签: php symfony datetime doctrine-orm


【解决方案1】:

你在构造函数中做。

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      【解决方案3】:

      在你的表单构建器中设置它:

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

      或在您的实体构造函数中

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          该属性只能是常量值。

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

          【讨论】:

            【解决方案6】:

            如果您想为 $timestamp 设置一个默认值,请在您的实体中创建一个 _contruct,以便每次为该实体声明对象时,都会自动设置 $timestamp 的值。

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

            【讨论】:

              【解决方案7】:

              我正在使用 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"})
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-24
                • 1970-01-01
                • 2022-01-09
                • 1970-01-01
                • 2019-06-03
                • 2013-12-10
                相关资源
                最近更新 更多