ORMInvalidArgumentException: новый объект был найден через отношение Для нескольких итераций

Я получаю ошибку доктрины, как описано ниже. Я проверил решения, данные в других вопросах, но это не то, что я ищу.

Итак, в основном у меня есть действие для создания экзаменационных карт (просто ввод соответствующего кода) -

function generateExamCardAction{
    $examSetting = $this->getExamSetting();
    $this->insertExamCard($classId, $examSetting);
    $insertedExamCard = $this->fetchExamCard($classId);
    $this->generatePdf($insertedExamCard);
}

И функция insertExamCard выглядит так:

function insertExamCard($classId, $examSetting){
    $em = $this->getEntityManager();
    $examCard = new ExamCard();
    $examCard->setClassId($classId);
    $examCard->setExamSetting($examSetting);
    $em->persist($examCard);
    $em->flush();
    $em->clear();
}

И связь доктрины между ExamCard и ExamSetting выглядит следующим образом:

/**
 * @ORM\ManyToOne(targetEntity = "ExamSetting")
 * @ORM\JoinColumn(name = "ExamSettingId", referencedColumnName = "id")
 */
protected $examSetting;

Обратите внимание, что я не каскадировал его с помощью cascade = {"persist"}, потому что я не хочу любой ценой манипулировать таблицей ExamSetting, поскольку это главная таблица.

До сих пор все работает нормально. ExamCard вставляется правильно, затем правильно извлекается, а затем правильно генерирует PDF.

Но теперь мне нужно повторить логику в generateExamCardAction() для нескольких классов. Так что это будет так:

function generateExamCardAction{
    $examSetting = $this->getExamSetting();
    foreach($classes as $classId){
        $this->insertExamCard($classId, $examSetting);
        $insertedExamCard = $this->fetchExamCard($classId);
        $this->generatePdf($insertedExamCard);
    }
}

В этом случае первая итерация работает нормально. То есть для 1-го класса он вставляет ExamCard, затем правильно извлекает и генерирует pdf.

Но для второй итерации это дает ошибку ниже:

Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 'Application\Entity\ExamCard#examSetting' that was not configured to cascade persist operations for entity

Я считаю, что проблема в $em->clear().

Я попытался изменить его на $em->clear($examCard). В этом случае это не дает ошибки, но данные, полученные с помощью fetchExamCard(), не имеют полей ExamSetting, установленных в ExamCard.

Не могли бы вы помочь мне понять, почему он работает для одной итерации, но не для нескольких итераций?

Зачем ты вообще звонишь clear()?

Flying 24.02.2019 11:13

@Flying Если я удалю clear(), то fetchExamCard() не сможет каким-то образом получить сохраненную запись с подробностями ExamSetting.

rack_nilesh 24.02.2019 11:17

Я не знаю, что делает fetchExamCard(), но clear() удаляет все ваши объекты из карты идентификации, и, следовательно, они недоступны для Doctrine, и их необходимо повторно получить. Это должно негативно сказаться на производительности. Вернемся к теме: вы уверены, что объект, назначенный enamSetting, правильно сохраняется в Doctrine?

Flying 24.02.2019 11:23
Стоит ли изучать 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
3
103
0

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