Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
在Symfony 2.5 preUpdate事件侦听器中添加新的OneToMany关联实体_Symfony_Doctrine Orm - Fatal编程技术网

在Symfony 2.5 preUpdate事件侦听器中添加新的OneToMany关联实体

在Symfony 2.5 preUpdate事件侦听器中添加新的OneToMany关联实体,symfony,doctrine-orm,Symfony,Doctrine Orm,使用symfony2.5,声明preUpdate事件侦听器是限制性最强的。您不能仅对实体进行更改,而是必须使用特殊功能: $entity->setNewValue($fieldName, $value) 但是,我有一个实体$view,它有一个一对多关联的实体$routing,并且在我的$view对象中有一个特殊的setter,它添加了多个路由: class View { protected $routing; public function getRouting()

使用symfony2.5,声明preUpdate事件侦听器是限制性最强的。您不能仅对实体进行更改,而是必须使用特殊功能:

$entity->setNewValue($fieldName, $value)
但是,我有一个实体$view,它有一个一对多关联的实体$routing,并且在我的$view对象中有一个特殊的setter,它添加了多个路由:

class View { 

    protected $routing;

    public function getRouting() {
        return $this->routing;
    }

    public function addRouting(\Gutensite\CmsBundle\Entity\Routing\Routing $routing)
    {
        // Maintain Relationship
        $routing->setView($this);
        $this->routing[] = $routing;
        return $this;
    }
}
我在那个实体中没有setRouting函数,因为我有一个addRouting,因为它是一个多个onetomy关联

所以。。。在我的preUpdate事件侦听器中,我应该如何创建一个新的默认路由,并将其添加到视图中,因为$entity->setNewValue函数在集合中不起作用,显然我不能调用$view->addRouting$route。我尝试了这一点,但没有任何内容被持久化到数据库中

注意:从2.4开始,我们应该使用LifeCycleEventArgs而不是PreUpdateeEventArgs


您是否尝试实现setRoutingArrayCollection$routing方法,该方法将覆盖现有集合并执行以下操作:

$routings = $entity->getRouting();
// add entities to routing collection if needed
$eventArgs->setNewValue('routing', $routings);

您是否尝试实现setRoutingArrayCollection$routing方法,该方法将覆盖现有集合并执行以下操作:

$routings = $entity->getRouting();
// add entities to routing collection if needed
$eventArgs->setNewValue('routing', $routings);

我最终只是在一个onFlush事件中实现了这一点。对于我的用例来说,预更新限制太多。这就引出了一个问题:当onFlush更灵活时,为什么要使用preUpdate

预更新的好处 在实体中插入一个简单值,例如

$eventArgs->setNewValue('myField', $value);
您还可以访问实体旧值和新值,这对于轻松比较哪些字段发生了更改非常有用,这是我以前需要的

此事件具有强大的功能,但是,它是通过 PreUpdateEventArgs实例,其中包含对 此实体的计算更改集。这意味着您可以访问所有 此实体已更改的字段及其旧字段和新字段 价值 -

注意:如果确实使用preUpdate,请记住必须使用setNewValue语法,而不是实体的常规setter。无需重新计算更改集,您还可以:

任何对EntityManagerpersist或EntityManagerremove的调用,甚至 强烈建议不要与UnitOfWork API结合使用 在冲洗操作之外,不要按预期工作

预更新的问题 中不允许更改已更新实体的关联 此事件,因为条令无法保证正确处理 刷新操作此时的引用完整性。 -

因此,如果需要更新子项或父项值(例如更新父项的修改时间),则不能在preUpdate中进行更新,因为setNewValue方法是在当前实体的eventArgs上调用的,而不是在特定实体上调用的

或者,如果您需要添加一个集合(如我的问题中所述),出于我提到的原因,您不能调用像addRouting这样的自定义设置程序。我怀疑means@RomaKliuchko他的建议行不通


请添加其他优点和缺点。

我只是在onFlush事件中实现了这一点。对于我的用例来说,预更新限制太多。这就引出了一个问题:当onFlush更灵活时,为什么要使用preUpdate

预更新的好处 在实体中插入一个简单值,例如

$eventArgs->setNewValue('myField', $value);
您还可以访问实体旧值和新值,这对于轻松比较哪些字段发生了更改非常有用,这是我以前需要的

此事件具有强大的功能,但是,它是通过 PreUpdateEventArgs实例,其中包含对 此实体的计算更改集。这意味着您可以访问所有 此实体已更改的字段及其旧字段和新字段 价值 -

注意:如果确实使用preUpdate,请记住必须使用setNewValue语法,而不是实体的常规setter。无需重新计算更改集,您还可以:

任何对EntityManagerpersist或EntityManagerremove的调用,甚至 强烈建议不要与UnitOfWork API结合使用 在冲洗操作之外,不要按预期工作

预更新的问题 中不允许更改已更新实体的关联 此事件,因为条令无法保证正确处理 刷新操作此时的引用完整性。 -

因此,如果需要更新子项或父项值(例如更新父项的修改时间),则不能在preUpdate中进行更新,因为setNewValue方法是在当前实体的eventArgs上调用的,而不是在特定实体上调用的

或者,如果您需要添加一个集合(如我的问题中所述),出于我提到的原因,您不能调用像addRouting这样的自定义设置程序。我怀疑means@RomaKliuchko他的建议行不通


请添加其他优点和缺点。

也许我应该改用onFlush?也许我应该改用onFlush
ad?我没有尝试在视图实体上添加setRouting setter,并将其别名为addRouting。setNewValue的机制对我来说有点太神秘了。最后,我使用了一个onFlush事件,它更加可预测,并且对于更复杂的更新(例如集合)或更新父实体(从$eventArgs方法来看似乎不可能)似乎是必需的。将来我可能会避免使用preUpdate,我看不到它的好处。如果在实体上做注释足够简单,就在实体上做注释。如果太复杂,preUpdate无论如何也不会工作。我没有尝试在视图实体上添加setRouting setter,并将其别名为addRouting。setNewValue的机制对我来说有点太神秘了。最后,我使用了一个onFlush事件,它更加可预测,并且对于更复杂的更新(例如集合)或更新父实体(从$eventArgs方法来看似乎不可能)似乎是必需的。将来我可能会避免使用preUpdate,我看不到它的好处。如果在实体上做注释足够简单,就在实体上做注释。如果它太复杂,预更新无论如何都无法工作。