【问题标题】:Doctrine, how to handle multiple flush()教义,如何处理多个flush()
【发布时间】:2017-08-02 06:04:07
【问题描述】:

在我的 Symfony 2 应用程序中,我有以下场景,按以下顺序:

  1. 在我的控制器中,我对托管实体进行了一些编辑(即从 db 检索或持久化到实体管理器)
  2. 如果发生了什么事,在我的控制器中(或在从容器获取的外部服务中)我在其他实体中进行一些其他编辑,或者我 实例化一些新实体。我想刷新这些操作 (仅在第 2 点描述)立即
  3. 如果发生其他情况,我想编辑一些其他实体,并且我想刷新在 (1) 和 (3) 中所做的更改。否则,我不想刷新 (1) 和 (3) 中所做的更改

在 Doctrine 中有没有办法做到这一点,例如同时管理多个工作单元或类似的东西?否则,我正在查看此http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#update-queries,即针对第 (2) 点所做的每个更新的单个查询和此 http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/query-builder.html#sql-query-builder 针对第 (2) 点所做的插入,但我想知道是否有更好的方法。

【问题讨论】:

  • “最佳”方法是根本不使用 orm。您可以考虑使用两个实体管理器。你也可以这样做 $em->flush($entity);但同样,任何时候你尝试“开箱即用”orm,你都会遇到问题。
  • @Cerad 我想我会尝试使用两个 em。搜索谷歌并查看方法的文档,$em->flush($entity); 似乎弊大于利。

标签: php symfony doctrine-orm doctrine


【解决方案1】:

您可以拆分“系统”实体和“程序”实体并使用 2 个连接。看看here

【讨论】:

    【解决方案2】:

    您可以detach不想被刷新的实体并调用$em->flush();

    $em->detach($entity);
    

    【讨论】:

    • 如果您想稍后刷新分离的实体,您可以对它们进行标记:doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-objects.html#merging -实体
    • @Vladislav 如果在第 (2) 点中我确切地知道第 (1) 点中发生了什么,这可能会很好,但我不能做出这个假设
    • 您可以准备一个需要刷新的实体数组(使用 try-catch 块来查找是否发生了错误)并执行 $em->clear() ;, $em->persist($entity) 用于数组中的每个实体,然后是 $em->flush()。
    • 您可以拆分“系统”实体和“程序”实体并使用 2 个连接。 symfony.com/doc/current/doctrine/multiple_entity_managers.html
    • 另一种方法可能是创建您自己的支持实体组的持久化器。
    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 2017-06-18
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多