programing

독트린에서 updated_at, created_at에 대한 자동 값

sourcejob 2023. 7. 23. 14:14
반응형

독트린에서 updated_at, created_at에 대한 자동 값

나는 밭을 만들고 싶습니다.updated_at그리고.created_at자동으로 업데이트할 내 독트린 엔티티에서.

Ruby on Rails 모델에는 두 개의 필드가 있습니다.updated_at그리고.created_at.

설명은 http://guides.rubyonrails.org/migrations.html#migration-overview 에서 확인할 수 있습니다.

타임스탬프 매크로는 created_at 및 updated_at 두 개의 열을 추가합니다.이러한 특수 열은 존재하는 경우 활성 레코드에 의해 자동으로 관리됩니다.

독트린 2에서 유사한 기능을 활성화할 수 있습니까?

  1. 전화할 수 있습니다.$this->setCreatedAt(new \DateTime())__construct방법.
  2. Life Cycle 콜백을 사용할 수 있습니다.
/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
*/
public function updatedTimestamps(): void
{
    $this->setUpdatedAt(new \DateTime('now'));    
    if ($this->getCreatedAt() === null) {
        $this->setCreatedAt(new \DateTime('now'));
    }
}

엔티티 클래스 표기법에 추가하는 것을 잊지 마십시오.@ORM\HasLifecycleCallbacks

이 옵션은 별도로 처리하려는 경우에도 사용할 수 있습니다.

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

    ..........
}

나에게 가장 편리한 해결책은TimestampableSt of Doctrine의 특징확장 번들.

간단한 구성으로 나중에 필드를 만들 수 있습니다.createdAt그리고.updatedAtEntity두 개의 단순한 것을 추가하여 자동으로 작성됩니다.annotations예:

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

불필요한 중복 코드 없이PHP.

특성으로도 구현할 수 있습니다. 다음과 같습니다.

<?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;
}

경우에 따라 "createdAt" 열만 있는 일부 엔터티가 있고 "updateAt" 열만 있는 다른 엔터티일 수 있으며, 물론 "createdAt" 및 "updateAt" 열을 모두 가진 일부 엔터티일 수도 있습니다.세 가지 특성을 만들 수 있습니다.

src/Entity/Traits/Timestamping/
src/Entity/Traits/Timestamping/AutoCreatedAtTrait.php
src/Entity/Traits/Timestamping/AutoUpdatedAtTrait.php
src/Entity/Traits/Timestamping/TimestampableTrait.php
<?php

namespace App\Entity\Traits\Timestamping;

use Doctrine\ORM\Mapping as ORM;

/**
 * ThisTrait adds createdAt field to entity.
 */
trait AutoCreatedAtTrait
{
    /**
     * @var \DateTimeInterface $createdAt
     *
     * @ORM\Column(name="created_at", type="datetime", nullable=true)
     */
    protected $createdAt;

    /**
     * @return \DateTimeInterface
     */
    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->createdAt;
    }

    /**
     * @ORM\PrePersist
     */
    public function setCreatedAtValue(): self
    {
        $this->createdAt = new \DateTime();

        return $this;
    }
}

<?php

namespace App\Entity\Traits\Timestamping;

use Doctrine\ORM\Mapping as ORM;

/**
 * ThisTrait adds updatedAt field to entity.
 */
trait AutoUpdatedAtTrait
{
    /**
     * @var \DateTimeInterface $updatedAt
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable=true)
     */
    protected $updatedAt;

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

    /**
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function setUpdatedAtValue(): self
    {
        $this->updatedAt = new \DateTime();

        return $this;
    }
}

<?php

namespace App\Entity\Traits\Timestamping;

/**
 * ThisTrait adds Timestampable fields to entity.
 */
trait TimestampableTrait
{
    use AutoCreatedAtTrait, AutoUpdatedAtTrait;
}

<?php

namespace App\Entity;

use App\Entity\Traits\Timestamping\AutoCreatedAtTrait;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\OnlyCreationDateEntityRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class OnlyCreationDateEntity
{
    use AutoCreatedAtTrait;
}
<?php

namespace App\Entity;

use App\Entity\Traits\Timestamping\TimestampableTrait;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\BothColumnsEntityRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class BothColumnsEntity
{
    use TimestampableTrait;
}

엔티티 클래스 표기법에 추가하는 것을 잊지 마십시오.@ORM\HasLifecycleCallbacks

타임스탬프 가능한 특성을 사용하는 것이 좋습니다.

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

use Gedmo\Timestampable\Traits\TimestampableEntity;

class Article
{
    use TimestampableEntity;
}

모든 적절한 기능이 자동으로 추가됩니다.

언급URL : https://stackoverflow.com/questions/17321893/automatic-values-for-updated-at-created-at-in-doctrine

반응형