在 Doctrine 记录 class 中,从数据库中查询相同的记录会覆盖 class 中的属性

From within a Doctrine record class, querying for the same record from the DB overwrites the properties within that class

在我的一个 Doctrine 记录 classes 中,我有一个 preSave 方法来执行检查。在此检查中,对我的记录所属的 table 进行了查询。此查询将从 table 中获取一条记录,我使用水合结果与 class 表示的当前记录进行比较。

在某些情况下,获取的水合结果将与我在 preSave 检查中使用的记录相同。但是,当发生这种情况时,我对第一条记录所做的任何更改都会在查询完成后恢复。

为什么会这样?有解决方法吗?

Doctrine 可能会维护对记录对象实例的单一引用,而不是在您的 preSave() 方法中创建一个全新的实例。因此,当对象被水合时,代码中任何其他相同类型的变量都是 'refreshed'。

要验证这一点,请使用 spl_object_hash() 函数检查代码中变量的对象 ID。

在没有看到您的代码的情况下,解决方法建议可能会有所不同,但一种可能的解决方法是在 preSave() 中混合数组:

$query = Doctrine_Query::create()
->select('foo')
->from('Bar b')
->where('b.id = ?', $id);

$results = $query->execute(array(), Doctrine::HYDRATE_ARRAY);

您将失去将结果用作对象的能力,但您将能够使用数组的内容进行比较。