如何使 Doctrine 的预更新生命周期回调更新字段即使计算的变更集为空


How to make Doctrine's preUpdate lifecycle callback update field even if the computed changeset is empty?

我有一个实体,我希望在更改其属性之一时更新其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字段将使用 MySQL 中的当前datetime进行更新。

但是,当我需要将空字符串设置为值时,如下所示:

$entity->setOneProperty('');
$entity->flush();

updatedAt字段在我需要时不会更新。

我很确定这与文档的以下部分有关:

preUpdate - preUpdate 事件发生在对实体数据执行数据库更新操作之前。它不会为 DQL UPDATE 语句调用,也不会在计算的变更集为空时调用。

所以我的问题是,即使计算的变更集为空,我如何覆盖此行为并让 Doctrine 更新字段?我也愿意知道如何访问这个变化集,以便自己调查。

谢谢。

在将 oneProperty 设置为空字符串之前,它的值是多少?

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

每次更改时更新 updateAt 字段的一种简单方法是在实体中使用构造函数。 例如

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