我有一个实体,我希望在对其中一个属性进行更改时更新其updatedAt
字段(即使其中一个值更改为空字符串)。
因此,我有以下代码:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* MyEntity
*
* @ORM\Table(name="my_entity")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class MyEntity
{
// ...
/**
* @var datetime
*
* @ORM\Column(name="updated_at", type="datetime", nullable=false)
*/
protected $updatedAt;
// ...
/**
* @ORM\PreUpdate()
*/
public function preUpdate()
{
$this->updatedAt = new \DateTime();
}
}
所以说到:
$entity = $repository->findById($id);
$entity->setOneProperty('oneValue');
$entity->flush();
使用updatedAt
中的当前datetime
更新MySQL
字段。
但是,当我需要将空字符串设置为值时,如下所示:
$entity->setOneProperty('');
$entity->flush();
我需要时,updatedAt
字段不会更新。
我很确定这与documentation的以下部分有关:
preUpdate - preUpdate事件发生在对实体数据的数据库更新操作之前。它不会被调用DQL UPDATE语句,也不会被计算的变更集为空。
所以我的问题是如何重写此行为并让Doctrine更新字段,即使计算的变更集为空?我也愿意知道我如何能够访问这个变化集,以便自己进行调查。
感谢。
答案 0 :(得分:0)
将 oneProperty 的值设置为空字符串之前有什么价值?
其中一种方式(但它很丑陋)是在您需要的每个setter中更新您的属性 updatedAt (您可以尝试使用__set)。它会起作用,但它不是一个好的解决方案。
答案 1 :(得分:0)
一种对update进行每次更改的简单方法是在您的实体中使用构造函数。例如。
public function __construct()
{
$this->lastModified = new \DateTime();
}