Twig和Symfony2 - 未找到实体

时间:2013-06-27 08:19:09

标签: php symfony doctrine-orm entity

我有一个与其他一些实体相关的实体。 最后,我有一个像tat这样的对象:

paper.submission.authors

对于某些paper.submission,没有作者,在我的twig模板中,我正在做:

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

对于没有作者的paper.submission,我得到“未找到实体”例外。

是否有可能在我的for循环之前测试对象是否存在。

我已经尝试了定义,它总是如此。然后,我尝试过的不是null,但这也产生了异常。

非常感谢你。

3 个答案:

答案 0 :(得分:28)

问题

当Doctrine找不到相关实体时会抛出此异常。说这个似乎多余,但事实上这很重要 这意味着可以找到与之相关的ID,但请求原则与任何结果都不匹配。

我的猜测是您的数据库表(实际链接表)submission.authors包含0而不是NULL的ID。 有了这样的话,Doctrine认为 IS 是ID为0的作者,因此无法找到它。

会发生什么

submission.authors始终存在。它是未初始化的 Doctrine Proxy。

var_dump($submission->getAuthors());

会向您显示完全包含submission.authors的内容 此时,不会进行任何查询。它只会将带有标记PersistentCollectionisInitialized返回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

之前的ProxyFactory类中
$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;
}