Создание сущности как «Архив» в postRemove или preRemove - PullRequest
0 голосов
/ 22 ноября 2018

Контекст

В настоящее время у меня есть и объект 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);
    }

}

1 Ответ

0 голосов
/ 12 декабря 2018

Текущее решение (не оптимально)

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

...