2013-07-13 72 views
0

我建立一些業務應用,並讓說,有兩個表OrdersMonthlyReports
這些表格不直接相關(它們在ORM中定義的沒有關係)。
MonthlyReports存儲所有訂單的總金額,並且應在每個購買後更新,記錄在Orders表中。

我計劃用EventListener postPersist()自動改變MonthlyReports總量的價值,但我面對這個問題:
插入數據 - Symfony2的&Doctirne2

  • 學說不允許插入使用persist()方法旁邊的新的實體,並MonthlyReports不能持久,因爲它是不相關的Orders


所以我的問題是如何在每個月的月初創建一個新的報告,我應該創建一些假relatio這些表格之間的差距能夠堅持新的月度報告嗎?

回答

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

我還建議您在報表實體中定義一個Order實體的集合,以用於審計目的。

+0

好的,我有一個問題,假設這是一個月的第一天,我想隨時插入一個新的報告。 Doctrine手冊說:在DQL中不允許使用_INSERT語句,因爲實體及其關係必須通過EntityManager#persist()引入到持久化上下文中。http://docs.doctrine-project.org/zh-cn/latest/reference/ dql-doctrine-query-language.html #digital-of-dql-queries。考慮到這一點,我不確定如何使用報告庫插入新報告。 – phpsherpa