我有一个与其他一些实体相关的实体。 最后,我有一个像tat这样的对象:
paper.submission.authors
对于某些paper.submission,没有作者,在我的twig模板中,我正在做:
{% for author in paper.submission.authors}
do something
{% endfor %}
对于没有作者的paper.submission,我得到“未找到实体”例外。
是否有可能在我的for循环之前测试对象是否存在。
我已经尝试了定义,它总是如此。然后,我尝试过的不是null,但这也产生了异常。
非常感谢你。
答案 0 :(得分:28)
当Doctrine找不到相关实体时会抛出此异常。说这个似乎多余,但事实上这很重要 这意味着可以找到与之相关的ID,但请求原则与任何结果都不匹配。
我的猜测是您的数据库表(实际链接表)submission.authors
包含0
而不是NULL
的ID。
有了这样的话,Doctrine认为 IS 是ID为0
的作者,因此无法找到它。
submission.authors
始终存在。它是未初始化的 Doctrine Proxy。
var_dump($submission->getAuthors());
会向您显示完全包含submission.authors
的内容
此时,不会进行任何查询。它只会将带有标记PersistentCollection
的isInitialized
返回false。
当您尝试从中获取财产时会发生异常
foreach ($submission->getAuthors() as $author) {
}
执行此原则时,将检查getAuthors
是否已初始化。如果没有,它将运行以下查询
SELECT <stuffs> FROM authors WHERE id = 0;
返回不匹配,将抛出EntityNotFound
异常
您必须将您的ID行的默认值设置为NULL
并进行查询以将所有0
更新为NULL
。
有了这个,您可以使用submission.authors
is not null
如果Doctrine找到NULL
答案 1 :(得分:6)
如何调试以找到未找到的相关实体?
存储库https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Proxy/ProxyFactory.php#L160中的异常消息已得到改进,但如果使用旧版本,则可以执行以下调试。
如果您使用旧版本
将以下代码放在throw new EntityNotFoundException();
行供应商/ 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();
答案 2 :(得分:5)
在您的实体中,您可以制作以下内容:
public function getSubmission(){
if($this->Submission->getId()==0) return null;
return $this->Submission;
}