在非相关表格中插入数据 - Symfony2& Doctirne2

时间:2013-07-13 22:09:23

标签: php symfony orm doctrine-orm

我正在构建一些业务应用程序,并假设有两个表 Orders MonthlyReports
这些表没有直接关系(在ORM中定义它们之间没有关系) 表格MonthlyReports存储了所有订单的总金额,应在Orders表中记录的每次购买后更新。
我计划使用EventListener postPersist()自动更改MonthlyReports中的总金额值,但我遇到了这个问题:

  • Doctrine不允许在使用persist()方法旁边插入新实体,并且MonthlyReports无法持久化,因为它与Orders table
  • 无关


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

1 个答案:

答案 0 :(得分:1)

  

由于月度报告与订单表

无关,因此无法保留月报

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

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

注意,如果您将注册存储库注入到一个doctrine事件监听器中,那么如果您想避免周期性依赖,那么您将不得不从容器中获取它。

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

我还建议您在报表实体中定义一组Order实体,以便进行审计。