Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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

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
Php Doctrine2应该自动合并关联的实体_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php Doctrine2应该自动合并关联的实体

Php Doctrine2应该自动合并关联的实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我正在构建一个订单流程,在这个流程中,订单对象是通过许多步骤构建的。在每一步之后,我将部分完成的Order对象放入会话中,在最后一步中,我将其保存到数据库中 在这些步骤中,我将其他已经存在的关联对象加载到Order objecteg中。折扣券。问题是,当我将订单保存到会话中,然后在下一步加载它时,所有关联的实体都将分离。因此,当我想将其保存到数据库时,EntityManager会抛出一个异常,要求在关系上设置cascade=persist 当然,我不需要保留那些已经在数据库中的对象。显而易见的解

我正在构建一个订单流程,在这个流程中,订单对象是通过许多步骤构建的。在每一步之后,我将部分完成的Order对象放入会话中,在最后一步中,我将其保存到数据库中

在这些步骤中,我将其他已经存在的关联对象加载到Order objecteg中。折扣券。问题是,当我将订单保存到会话中,然后在下一步加载它时,所有关联的实体都将分离。因此,当我想将其保存到数据库时,EntityManager会抛出一个异常,要求在关系上设置cascade=persist

当然,我不需要保留那些已经在数据库中的对象。显而易见的解决方案是使用EntityManagermerge方法将这些关联对象更改为合并对象,但是,我有一个相当复杂的对象结构,包含多个层次的嵌入式实体,因此执行上述过程将非常不方便


我不能自动完成这项任务吗?因此,它可以自动合并我分离的实体,而不是“抱怨”我分离的实体。

据我所知,如果你试图使其完全自动化,你将创造出一些严重的魔法

您最好的选择可能是实现一个具有以下签名的函数:mergeOrderEntities$Order,$EntityManager,它知道如何谈论订单结构并在所有分离的关联实体上调用EntityManager::merge


至于为什么教义不会自动这么做,我不确定。我怀疑在某些用例中,自动合并实体可能是危险的,或者至少是不可取的

我不知道条令,但是:无论如何,我可能不会在会话中存储对象,以防条令对象需要无法正确序列化的资源项。我会将这些对象的主键存储在会话中,这样当它们被检索时,你只需执行一个select操作,并且可能在原则中,你可以请求自动加载相关的行。好吧,这可能是一个解决方案,但它会打破我真正讨厌的OO设计。通过这种方式,我可以使用稍后保存到DB中的相同实体对象。这些对象只存储数据和其他实体对象,所有这些对象都可以序列化。大多数对象不在数据库中,它们是在订单处理过程中正确构建的。唯一的问题是数据库中的项目在保存到会话中并从会话中加载后会分离。我敢打赌分离效果是由于我提到的会话限制。我相信还有另一种基于对象的方法可以做到这一点——只是附带一个条件,即您必须重新创建每个页面视图中涉及的对象。分离效果是由以下事实造成的:已使用实体的引用必须存储在EntityManager中,并且如果我在不使用EntityManager的情况下访问实体,例如从会话中访问实体,EntityManager找不到它的引用。当我使用merge命令时,它会记录引用,将实体的状态设置为managed,并从该点开始工作。我只是不知道为什么它不能自动化。自动化可能是一种选择。“级联”属性有一个合并选项@ORM\OneToManytargetEntity=折扣优惠券,mappedBy=订单,cascade={merge}但它没有帮助。它实际上做什么?文件上什么也没说。我想到的是创建一个递归遍历对象并合并它找到的所有分离实体的函数。我只是不想重新发明轮子,所以我先问你。我感觉到你了。这可能值得在邮件列表中询问。我问了,有人建议在会话中存储表单数据,因此我从每个页面加载的表单数据中构建Order对象。