Создание объекта как "Архивного" в postRemove или preRemove

Контекст

В настоящее время у меня есть сущность 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 22.11.2018 18:37

@dbrumann Я только что добавил postRemove по вашему запросу. Я также могу опубликовать preRemove, если нужно, но с той лишь разницей, что я не использую flush().

Marc-André 22.11.2018 18:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
178
1

Ответы 1

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

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

Другие вопросы по теме