【问题标题】:Inserting data in non related table - Symfony2 & Doctirne2在不相关的表中插入数据 - Symfony2 & Doctirne2
【发布时间】:2013-07-13 22:09:22
【问题描述】:

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

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

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


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

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

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

    Doctrine 事件不与特定实体及其关系耦合。你可以定义一个监听器来做任何你想做的事情。

    <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 实体的集合以用于审计。

    【讨论】:

    • 好的,我有一个问题,假设这是一个月的第一天,我想即时插入一份新报告。 Doctrine 手册说:INSERT 语句在 DQL 中是不允许的,因为实体及其关系必须通过 EntityManager#persist() docs.doctrine-project.org/en/latest/reference/… 引入持久化上下文。考虑到这一点,我不确定如何使用报告存储库插入新报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多