上下文
我现在有和实体Request,它有一个Approval实体的集合。
我的目标是将批准从Request中删除后存档。
我试图让它在使用@preRemove或@postRemove的事件侦听器中工作(尽管在postRemove事件中在数据库中工作是一种不好的做法,但为了它,我尝试了)。
问题
但我无法让它在这两种情况下工作,除非我只有一份记录可存档。只要我有两个记录,它就会抛出一个异常。
@postRemove exception -它尝试删除相同的Approval两次。
注意:未定义索引: 0000000061b600620000000079e76cab
@preRemove exception -它试图持久化一个空的ArchivedApproval。
执行'INSERT INSERT tblArchivedApprovals (级别,RequestedOn,ApprovalStatus,ApproverComments,ApprovedOn,ApprovedAmount,ApproverID,RequestedBy,ApprovedBy,DeductionID)值(?,?)‘时发生异常: SQLSTATE 07002,0: MicrosoftCOUNT字段不正确或语法错误
@preRemove 查询:
INSERT INTO tblArchivedApprovals
([Level], RequestedOn, ApprovalStatus, ApproverComments, ApprovedOn, ApprovedAmount, ApproverID, RequestedBy, ApprovedBy, DeductionID)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Parameters: []任何关于如何做到这一点的想法都将不胜感激。
编辑:,以下是请求的侦听器类:
<?php
namespace App\Entity\EventListener;
use App\Entity\Approval;
use App\Entity\ArchivedApproval;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
class ApprovalListener
{
/**
* Archive the approval(s) to the approval history before removing them
*
* @ORM\PostRemove
*
* @param Approval $approval
* @param LifecycleEventArgs $event
*
* @return void
* @throws \Doctrine\ORM\ORMException
*/
public function postRemove(Approval $approval, LifecycleEventArgs $event): void
{
// Create and set values
$archivedApproval = new ArchivedApproval();
$archivedApproval->setDeductionRequest($approval->getDeductionRequest());
$archivedApproval->setRequestedOn($approval->getRequestedOn());
$archivedApproval->setRequestedBy($approval->getRequestedBy());
$archivedApproval->setApprover($approval->getApprover());
$archivedApproval->setLevel($approval->getLevel());
if (null !== $approval->getStatus()) {
$archivedApproval->setStatus($approval->getStatus());
$archivedApproval->setApproverComments($approval->getApproverComments());
$archivedApproval->setApprovedAmount($approval->getApprovedAmount());
$archivedApproval->setApprovedBy($approval->getApprovedBy());
$archivedApproval->setApprovedOn($approval->getApprovedOn());
}
// Save the approval history
/** @var EntityManager $em */
$em = $event->getEntityManager();
$em->persist($archivedApproval);
$em->flush($archivedApproval);
}
}发布于 2018-12-12 14:52:35
电流解(非最优)
到目前为止,我唯一的方法是将ArchivedApproval实体添加到Request实体的removeApproval函数中,但是我必须循环处理批准并逐个删除它们,而不是简单地调用$request->getApprovals()->clear();。
https://stackoverflow.com/questions/53434687
复制相似问题