Doctrine中的updated_at,created_at的自动值

时间:2013-06-26 13:47:48

标签: php doctrine-orm

我想在条款实体中设置字段updated_atcreated_at以自动更新。

在Ruby on Rails模型中,有两个字段:updated_atcreated_at

说明可在此处找到:http://guides.rubyonrails.org/migrations.html#migration-overview

  

时间戳宏添加了两列,created_at和updated_at。这些特殊列由Active Record自动管理(如果存在)。

我可以在Doctrine 2中启用类似的功能吗?

4 个答案:

答案 0 :(得分:91)

  1. 您可以使用$this->setCreatedAt(new \DateTime())方法拨打__construct
  2. 您可以使用Life Cycle Callbacks
  3. /**
     * @ORM\PrePersist
     * @ORM\PreUpdate
    */
    public function updatedTimestamps(): void
    {
        $this->setUpdatedAt(new \DateTime('now'));    
        if ($this->getCreatedAt() === null) {
            $this->setCreatedAt(new \DateTime('now'));
        }
    }
    

    并且不要忘记添加到实体类表示法中: @ORM\HasLifecycleCallbacks

答案 1 :(得分:54)

如果您想单独处理它们,这是另一种选择。

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="person")
 * @ORM\HasLifecycleCallbacks
 */
class Person
{
    ..........

    /**
     * @var datetime $created
     *
     * @ORM\Column(type="datetime")
     */
    protected $created;

    /**
     * @var datetime $updated
     * 
     * @ORM\Column(type="datetime", nullable = true)
     */
    protected $updated;


    /**
     * Gets triggered only on insert

     * @ORM\PrePersist
     */
    public function onPrePersist()
    {
        $this->created = new \DateTime("now");
    }

    /**
     * Gets triggered every time on update

     * @ORM\PreUpdate
     */
    public function onPreUpdate()
    {
        $this->updated = new \DateTime("now");
    }

    ..........
}

答案 2 :(得分:7)

The most convinient solution for me is Timestampable feature of StofDoctrineExtensionsBundle

简单配置以后您可以通过添加两个简单的createdAt来自动填写updatedAtEntity的字段:

annotations

和/或

@Gedmo\Mapping\Annotation\Timestampable(on="create")

e.g。

@Gedmo\Mapping\Annotation\Timestampable(on="update")

/** * @var \DateTime * @Gedmo\Mapping\Annotation\Timestampable(on="create") * @Doctrine\ORM\Mapping\Column(type="datetime") */ protected $createdAt; /** * @var \DateTime * @Gedmo\Mapping\Annotation\Timestampable(on="update") * @Doctrine\ORM\Mapping\Column(type="datetime") */ protected $updatedAt; 中没有任何冗余代码。

答案 3 :(得分:0)

我建议使用时间戳特征

https://symfonycasts.com/screencast/symfony4-doctrine/timestampable

sorted_tuples = sorted(my_dict.items(), key=lambda x: x[::-1])

将自动添加所有适当的功能