如果更改了子项,如何更新父对象?

时间:2018-03-20 20:26:49

标签: php symfony

如果更改了子项,如何更新父对象?

我有拥有儿童街的实体城市。我希望在城市实体中保存几公里的街道。

City
id | name    | total
1  | example | 1000

Street
id | city_id | name   | kilometers
1  | 1       | first  | 800
2  | 1       | second | 200

我尝试过Lifecycle Callbacks(PreUpdate和PostUpdate)和Doctrine听众 - preUpdate i postUpdate。对于City来说都是如此,但如果我不编辑城市,两者都不会起作用。因此,如果我为Street设置听众,那么这很好,但是每个编辑过的街道都会执行听众。

我可以在控制器中进行此操作,但我想使用事件。

2 个答案:

答案 0 :(得分:0)

与Magnus说的一样,您可以使用自定义查询,该查询使用聚合函数SUM()来获取所有子实体的总公里数。只是需要额外的查询。另一种对我来说很好的方法是域模型,如下所示:

class City {

    // ...

    public function getTotalStreetLength()
    {
        $km = 0;

        foreach($this->streets as $street)
        {
            $km += $street->getKilometers();
        }

        return $km;
    }
}

很高兴阅读:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/aggregate-fields.html

答案 1 :(得分:0)

您必须自己设置规则。在我的情况下,我使用父级中的时间戳的版本字段完成此操作。有一个setVersion setter,它不会接收任何用te时间戳更新该值的参数。

然后我每次更新任何字段时都会从子实体调用此方法。

我用它来触发由FosElasticaBundle管理的Elasticsearch索引中的文档更新。