В настоящее время у меня есть сущность Request, в которой есть коллекция сущностей Approval.
Моя цель - получить одобрение архив после их удаления из Request.
Я попытался заставить его работать в прослушивателе событий, используя @preRemove или @postRemove (хотя это плохая практика для работы с базой данных в событии postRemove, но я пытался ради этого).
Но я не могу заставить его работать ни в одном из них, если у меня нет только 1 записи для архивации. Как только у меня будет 2 записи, возникнет исключение.
@postRemove исключение - дважды пытается удалить один и тот же Approval.
Notice: Undefined index: 0000000061b600620000000079e76cab
@preRemove исключение - пытается сохранить пустой ArchivedApproval.
An exception occurred while executing 'INSERT INTO tblArchivedApprovals ([Level], RequestedOn, ApprovalStatus, ApproverComments, ApprovedOn, ApprovedAmount, ApproverID, RequestedBy, ApprovedBy, DeductionID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)':
SQLSTATE [07002, 0]: [Microsoft][ODBC Driver 17 for SQL Server]COUNT field incorrect or syntax error
@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);
}
}
@dbrumann Я только что добавил postRemove по вашему запросу. Я также могу опубликовать preRemove, если нужно, но с той лишь разницей, что я не использую flush().






Текущее решение (не оптимальное)
На данный момент у меня есть единственный способ сделать это - добавить объект ArchivedApproval в функцию Request объекта removeApproval, но я должен пройти через все утверждения и удалить их одно за другим вместо того, чтобы просто вызывать $request->getApprovals()->clear();.
Пожалуйста, добавьте код вашего слушателя.