Подтвердить что ты не робот

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

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

paper.submission.authors

Для некоторых статей в документе нет автора, и в моем шаблоне twig я делаю:

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

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

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

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

Спасибо вам заблаговременно.

4b9b3361

Ответ 1

Проблема

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

Я предполагаю, что ваша таблица базы данных (фактически таблица ссылок) submission.authors содержит идентификаторы 0 вместо NULL.
С такой доктриной считается, что IS автор с идентификатором 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 Исключение

Fix

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

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

Ответ 2

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

Сообщение об исключении улучшилось в репозитории 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();

Ответ 3

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

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