Intereting Posts

Twig и Symfony2 – сущность не найдена

У меня есть объект, который связан с некоторыми другими объектами. В конце у меня есть объект вроде tat:

paper.submission.authors 

Для некоторых из документов. Нет автора, и в моем шаблоне ветки я делаю:

 {% for author in paper.submission.authors} do something {% endfor %} 

И для публикации статьи без авторов я получаю исключение «Сущность не найден».

Есть ли у вас какая-либо возможность проверить, существует ли объект перед циклом for.

Я попробовал определение, это всегда так. Затем я попробовал не null, но это также генерирует исключение.

Заранее большое спасибо.

проблема

Doctrine выбрасывает это исключение, когда оно не находит связанную сущность. Кажется излишним сказать это, но на самом деле это важно.
Это означает, что он может найти идентификатор, связанный с ним, но сделанная доктрина запроса не соответствует никакому результату.

Я предполагаю, что ваша таблица базы данных (фактически таблица ссылок) submission.authors содержит идентификаторы 0 вместо NULL .
С такой доктриной считается, что есть автор с идентификатором 0 , и поэтому не может его найти.

Что происходит

submission.authors всегда существует. Это неинициализированный прокси- сервер доктрины.

 var_dump($submission->getAuthors()); 

Покажет вам, что содержит точно submission.authors
На данный момент запросов нет. Он просто возвращает PersistentCollection с флагом isInitialized в false.

Исключение возникает, когда вы пытаетесь получить от него свойство

 foreach ($submission->getAuthors() as $author) { } 

Когда эта доктрина будет проверять, инициализируется ли getAuthors . Если нет, он выполнит следующий запрос

 SELECT <stuffs> FROM authors WHERE id = 0; 

Который не возвращает совпадения и будет EntityNotFound исключение EntityNotFound

исправлять

Вы должны установить для своей строки id значение NULL и сделать запрос для обновления всех 0 до NULL .
С этим вы можете легко протестировать submission.authors

Doctrine не будет запускать какой-либо запрос, если он найдет NULL

Как отладить, чтобы найти связанный объект не найден?

Сообщение об исключении улучшилось в репозитории https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Proxy/ProxyFactory.php#L160, но если вы используете более старую версию, вы можете выполнить следующую отладку.

Если вы используете более старую версию

Поместите следующий код в класс ProxyFactory перед тем, как throw new EntityNotFoundException(); line vendor / doctrine / orm / lib / Doctrine / ORM / Proxy / ProxyFactory.php: 177

 $entity = $classMetadata->getReflectionClass()->getShortName(); $id = $classMetadata->getIdentifierValues($proxy)['id']; var_dump("$entity WHERE id = $id NOT FOUND.");exit; throw new EntityNotFoundException(); 

В вашей организации вы можете сделать что-то вроде этого:

 public function getSubmission(){ if($this->Submission->getId()==0) return null; return $this->Submission; }