如果更改了子项,如何更新父对象?
我有拥有儿童街的实体城市。我希望在城市实体中保存几公里的街道。
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设置听众,那么这很好,但是每个编辑过的街道都会执行听众。
我可以在控制器中进行此操作,但我想使用事件。
答案 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索引中的文档更新。