Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 版本/跟踪实体的单个属性_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php 版本/跟踪实体的单个属性

Php 版本/跟踪实体的单个属性,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,假设我正在与一个名为Person的实体合作。人有身高、体重等属性。。。这可以随着时间的推移而改变 class Person { private $id; private $weight; private $height; // etc... } 我希望用户能够返回并在某种形式的图形上看到随时间的变化。存储每个单独属性的每次连续更改的最佳方法是什么 我已经看过DoctrineExtension日志接口,但它为整个对象创建了一个更改条目,因此您不能通过独立于已更改

假设我正在与一个名为Person的实体合作。人有身高、体重等属性。。。这可以随着时间的推移而改变

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

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

我已经看过DoctrineExtension日志接口,但它为整个对象创建了一个更改条目,因此您不能通过独立于已更改对象的特定属性向后“浏览”

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

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

例如:

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

class PersonWeightEntry
{
    private $value;
    private $timestamp;

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

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

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

使用OneToMany关系映射多个属性将导致数据库负载增加,并使计算变得更重

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