Я получаю ошибку доктрины, как описано ниже. Я проверил решения, данные в других вопросах, но это не то, что я ищу.
Итак, в основном у меня есть действие для создания экзаменационных карт (просто ввод соответствующего кода) -
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.
Не могли бы вы помочь мне понять, почему он работает для одной итерации, но не для нескольких итераций?
@Flying Если я удалю clear(), то fetchExamCard() не сможет каким-то образом получить сохраненную запись с подробностями ExamSetting.
Я не знаю, что делает fetchExamCard(), но clear() удаляет все ваши объекты из карты идентификации, и, следовательно, они недоступны для Doctrine, и их необходимо повторно получить. Это должно негативно сказаться на производительности. Вернемся к теме: вы уверены, что объект, назначенный enamSetting, правильно сохраняется в Doctrine?






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