即使计算出的变更集为空,如何制作Doctrine的preUpdate生命周期回调更新字段?

时间:2016-01-15 13:26:23

标签: php mysql symfony callback doctrine

我有一个实体,我希望在对其中一个属性进行更改时更新其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更新字段,即使计算的变更集为空?我也愿意知道我如何能够访问这个变化集,以便自己进行调查。

感谢。

2 个答案:

答案 0 :(得分:0)

oneProperty 的值设置为空字符串之前有什么价值?

其中一种方式(但它很丑陋)是在您需要的每个setter中更新您的属性 updatedAt (您可以尝试使用__set)。它会起作用,但它不是一个好的解决方案。

答案 1 :(得分:0)

一种对update进行每次更改的简单方法是在您的实体中使用构造函数。例如。

public function __construct()
{
    $this->lastModified = new \DateTime();
}