독트린에서 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에서 유사한 기능을 활성화할 수 있습니까?
- 전화할 수 있습니다.
$this->setCreatedAt(new \DateTime())에__construct방법. - 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그리고.updatedAt의Entity두 개의 단순한 것을 추가하여 자동으로 작성됩니다.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
'programing' 카테고리의 다른 글
| PostgreSQL: 고유 위반: 7 오류: 중복 키 값이 고유 제약 조건 "users_pkey"를 위반함 (0) | 2023.07.23 |
|---|---|
| Oracle SQL보다 작거나 같음 (0) | 2023.07.23 |
| 이미지를 제자리에서 90도 회전시키는 알고리즘?(추가 메모리 없음) (0) | 2023.07.23 |
| 메모리에서 열립니까? (0) | 2023.07.23 |
| 열 머리글이 Oracle 출력 전체에 계속 나타남 (0) | 2023.07.23 |