我想在条款实体中设置字段updated_at
和created_at
以自动更新。
在Ruby on Rails模型中,有两个字段:updated_at
和created_at
。
说明可在此处找到:http://guides.rubyonrails.org/migrations.html#migration-overview:
时间戳宏添加了两列,created_at和updated_at。这些特殊列由Active Record自动管理(如果存在)。
我可以在Doctrine 2中启用类似的功能吗?
答案 0 :(得分:91)
$this->setCreatedAt(new \DateTime())
方法拨打__construct
。/**
* @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
来自动填写updatedAt
和Entity
的字段:
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])
将自动添加所有适当的功能