15

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

paper.submission.authors

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

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

对于没有作者的论文提交,我收到“找不到实体”异常。

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

我尝试过定义,它总是正确的。然后,我试过不为空,但这也产生了异常。

非常感谢您提前。

4

3 回答 3

29

问题

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

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

发生什么了

submission.authors一直存在。它是一个未初始化的Doctrine 代理。

var_dump($submission->getAuthors());

将向您显示确切包含的内容submission.authors
此时,不进行任何查询。它只是将PersistentCollection带有标志的a返回isInitialized为false。

当您尝试从中获取属性时会发生异常

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

当做这个学说时会检查是否getAuthors被初始化。如果没有,它将运行以下查询

SELECT <stuffs> FROM authors WHERE id = 0;

哪个返回不匹配并将抛出EntityNotFound异常

使固定

您必须将 id 行的默认值设置为NULL并进行查询以将所有0's 更新为NULL
有了这个,您可以轻松地submission.authors测试is not null

如果 Doctrine 找到一个NULL

于 2013-06-27T08:53:48.410 回答
8

如何调试以查找未找到哪个相关实体?

存储库中改进了异常消息 https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Proxy/ProxyFactory.php#L160但如果您使用旧版本,您可以进行以下调试。

如果您使用旧版本

throw new EntityNotFoundException();在行 vendor/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();
于 2016-01-29T14:37:44.483 回答
6

在您的实体中,您可以制作如下内容:

public function getSubmission(){
    if($this->Submission->getId()==0) return null;
    return $this->Submission;
}
于 2015-07-17T08:07:00.757 回答