Php 在非相关表中插入数据-Symfony2&;博士2

Php 在非相关表中插入数据-Symfony2&;博士2,php,symfony,orm,doctrine-orm,Php,Symfony,Orm,Doctrine Orm,我正在构建一些业务应用程序,假设有两个表订单和月度报告这些表没有直接关联(ORM中定义的它们之间没有关系)。 表月度报告存储了所有订单的总金额,并且在记录在订单表中的每次购买后都应更新该表。 我计划使用EventListener postPersist()自动更改MonthlyReports中总金额的值,但我面临这个问题: 条令不允许在使用persist()方法的旁边插入新实体,并且不能持久化月报表,因为它与订单表无关 所以我的问题是如何在每个月初创建一份新的报告,我是否应该在这些表之间创

我正在构建一些业务应用程序,假设有两个表
订单
月度报告

这些表没有直接关联(ORM中定义的它们之间没有关系)。
月度报告
存储了所有订单的总金额,并且在记录在
订单
表中的每次购买后都应更新该表。

我计划使用
EventListener postPersist()
自动更改
MonthlyReports
中总金额的值,但我面临这个问题:

  • 条令不允许在使用persist()方法的旁边插入新实体,并且不能持久化
    月报表
    ,因为它与
    订单
    表无关

所以我的问题是如何在每个月初创建一份新的报告,我是否应该在这些表之间创建一些虚假的关系,以便能够保存新的月度报告

无法持久化MonthlyReports,因为它与Orders表无关

条令事件不与特定实体及其关系耦合。您可以定义一个侦听器来执行任何您想要的操作

<service id="your_namespace.entity.listener.monthly_report_recalculator" class="Your\NamespaceBundle\EventListener\MonthylReportRecalculator">
    <tag name="doctrine.event_listener" event="prePersist" method="prePersist" priority="80" />

    <call method="setContainer">
        <argument type="service" id="service_container" />
    </call>
</service>

注意,如果您将存储库注入到一个条令事件侦听器中,如果您希望避免周期性依赖,那么很遗憾,您必须从容器中获取它

<?php

namespace Your\NamespaceBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\DependencyInjection\ContainerInterface;

class MonthylReportRecalculator
{
    /**
     * @var \Symfony\Component\DependencyInjection\ContainerInterface
     */
    private $container;

    /**
     * Define Container
     *
     * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
     */
    public function setContainer(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function prePersist(LifecycleEventArgs $event)
    {
        $entity = $event->getEntity();

        if ( ! $entity instanceof Order) {
            return;
        }

        // grab the report repository from container
        // update your report entity
        // save via repository
    }
}

好的,我有一个问题,假设这是一个月的第一天,我想动态插入一份新报告。条令手册说:DQL中不允许使用INSERT语句,因为必须通过EntityManager#persist()将实体及其关系引入持久性上下文。考虑到这一点,我不知道如何使用报表存储库插入新报表。