Контекст
В настоящее время у меня есть и объект Request
, который имеет коллекцию Approval
объектов.
Моя цель - архивировать утверждение, как только они будутудален из Request
.
Я пытался заставить его работать в прослушивателе событий, используя @preRemove
или @postRemove
(хотя это плохая практика для работы с базой данных в postRemove
событие, но я попытался ради этого).
Выпуск
Но я не могу заставить его работать ни в одном из них, если у меня только 1 запись для архивирования.Как только у меня будет 2 записи, он выдаст исключение.
@postRemove
исключение - он пытается удалить один и тот же Approval
дважды.
Примечание: неопределенный индекс: 0000000061b600620000000079e76cab
@preRemove
исключение - пытается сохранить пустое значение ArchivedApproval
.
Исключение произошло во времявыполнение 'INSERT INTO tblArchivedApprovals ([Уровень], RequestedOn, ApprovalStatus, ApproverComments, ApprovedOn, ApprovedAmount, ApproverID, RequestedBy, ApprovedBy, DeductionID) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)?':
SQLSTATE [07002, 0]: [Microsoft] [Драйвер ODBC 17 для SQL Server] Поле COUNT неверно или синтаксическая ошибка
@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);
}
}