0

假设我正在使用一个名为 Person 的实体。人具有诸如身高、体重等属性,这些属性可以随着时间的推移而改变。

class Person
{
    private $id;
    private $weight;
    private $height;

    // etc...
}

我希望用户能够返回并在某种形式的图表上查看随时间的变化。为每个单独的属性存储每个连续更改的最佳方法是什么?

我查看了 DoctrineExtension Loggable 接口,但它为整个对象创建了一个更改条目,因此您不能通过与对象无关的特定属性向后“浏览”,该属性已更改。

同样,使用 Loggable 恢复到以前的版本会导致您丢失所述版本和当前版本之间的任何更改(如预期的那样,但我希望能够删除特定条目)。

最好的方法是从 Person 到“条目对象”的经典OneToMany/ManyToOne关系,例如or (其中包含条目的值和时间戳),将最新的时间戳作为当前值?PersonHeightEntryPersonWeightEntry

例子:

class Person
{
// @ORM\OneToMany(...)
private $weight_entries;
}

class PersonWeightEntry
{
    private $value;
    private $timestamp;

    // @ORM\ManyToOne(...)
    private $person;
}
4

1 回答 1

0

实际上,Loggable 接口可用于在数据库中存储对象的不同版本,同时将数据以另一种形式呈现给用户。例如,您可以从数据库中读取不同的高度并将它们呈现出来,而无需显示整个对象。

您还可以通过使用从该对象的旧版本获得的旧值覆盖实际对象的属性,来“恢复”仅对一个属性的更改。

将许多属性映射到 OneToMany 关系将导致数据库负载并使计算变得更重。

我会使用 Loggable 接口,将完整的对象存储在数据库中,然后根据您的需要更改应用程序中的表示。

于 2013-01-08T13:44:19.567 回答