【问题标题】:Inserting data in non related table - Symfony2 & Doctirne2在不相关的表中插入数据 - Symfony2 & Doctirne2
【发布时间】:2013-07-13 22:09:22
【问题描述】:
我正在构建一些业务应用程序,假设有两个表 Orders 和 MonthlyReports 。
这些表不直接相关(在 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 实体的集合以用于审计。