0

我正在构建一些业务应用程序,假设有两个表OrdersMonthlyReports.
这些表不直接相关(在 ORM 中定义它们之间没有关系)。
MonthlyReports中存储了所有订单的总金额,每次购买后都会更新Orders表中记录的金额。

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

  • Doctrine 不允许在使用 persist() 方法之外插入新实体,并且由于与tableMonthlyReports无关,因此无法持久化Orders


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

4

1 回答 1

1

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
    }
}

我还建议您在 Report 实体中定义 Order 实体的集合以进行审计。

于 2013-07-14T02:43:21.030 回答