59

我想让字段updated_atcreated_at我的Doctrine 实体自动更新。

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

描述可以在这里找到: http: //guides.rubyonrails.org/migrations.html#migration-overview

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

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

4

5 回答 5

123
  1. 你可以调用方法$this->setCreatedAt(new \DateTime())__construct
  2. 您可以使用生命周期回调
/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
*/
public function updatedTimestamps(): void
{
    $this->setUpdatedAt(new \DateTime('now'));    
    if ($this->getCreatedAt() === null) {
        $this->setCreatedAt(new \DateTime('now'));
    }
}

并且不要忘记添加到实体类符号中: @ORM\HasLifecycleCallbacks

于 2013-06-26T15:04:46.780 回答
83

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

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");
    }

    ..........
}
于 2015-04-21T10:53:59.517 回答
23

对我来说最方便的解决方案是StofDoctrineExtensionsBundleTimestampable的功能。

简单的配置,稍后您可以通过添加两个简单的方式来自动填写字段createdAt和填写:updatedAtEntityannotations

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

和/或

@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;

pure 中没有任何冗余代码PHP

于 2018-05-10T18:50:16.823 回答
8

您也可以将其实现为特征 - 如下所示:

<?php

namespace App\Entity\Traits;

use DateTime;
use DateTimeInterface;
use Exception;

/**
 * Trait TimeStampableTrait
 * @package App\Entity\Trait
 */
trait TimeStampableTrait
{
    /**
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

    /**
     * @ORM\Column(type="datetime")
     */
    private $updatedAt;

    /**
     * @return DateTimeInterface|null
     * @throws Exception
     */
    public function getCreatedAt(): ?DateTimeInterface
    {
        return $this->createdAt ?? new DateTime();
    }

    /**
     * @param DateTimeInterface $createdAt
     * @return $this
     */
    public function setCreatedAt(DateTimeInterface $createdAt): self
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * @return DateTimeInterface|null
     */
    public function getUpdatedAt(): ?DateTimeInterface
    {
        return $this->updatedAt ?? new DateTime();
    }

    /**
     * @param DateTimeInterface $updatedAt
     * @return $this
     */
    public function setUpdatedAt(DateTimeInterface $updatedAt): self
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function updateTimestamps(): void
    {
        $now = new DateTime();
        $this->setUpdatedAt($now);
        if ($this->getId() === null) {
            $this->setCreatedAt($now);
        }
    }
}

将此特征添加到您的实体(并且不要忘记@ORM\HasLifecycleCallbacks()符号):

<?php

namespace App\Entity;

use App\Entity\Traits\TimeStampableTrait;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\MyEntityRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class MyEntity
{
    use TimeStampableTrait;
}
于 2020-01-20T15:06:15.090 回答
0

我建议使用可时间戳的特征

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

use Gedmo\Timestampable\Traits\TimestampableEntity;

class Article
{
    use TimestampableEntity;
}

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

于 2020-11-11T21:43:12.890 回答