Twig和Symfony2 - 未找到实体

Mil*_*loš 15 php entity symfony doctrine-orm

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

paper.submission.authors
Run Code Online (Sandbox Code Playgroud)

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

{% for author in paper.submission.authors}
    do something
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

对于没有作者的paper.submission,我得到"未找到实体"异常.

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

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

非常感谢你提前.

Tou*_*uki 28

问题

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

我的猜测是你的数据库表(实际上是链接表)submission.authors包含的是0而不是NULL.
有了这样,学说认为有IS使用的ID的作者0,以及为此,找不到它.

怎么了

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

var_dump($submission->getAuthors());
Run Code Online (Sandbox Code Playgroud)

会告诉你什么包含确切的内容submission.authors
此时,不会进行任何查询.它只返回PersistentCollection带有标志的a isInitialized为false.

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

foreach ($submission->getAuthors() as $author) {
}
Run Code Online (Sandbox Code Playgroud)

执行此原则时将检查是否getAuthors已初始化.如果没有,它将运行以下查询

SELECT <stuffs> FROM authors WHERE id = 0;
Run Code Online (Sandbox Code Playgroud)

返回不匹配,将抛出EntityNotFound异常

固定

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

如果发现,则Doctrine不会运行任何查询 NULL


Far*_*mov 7

如何调试以找到未找到的相关实体?

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

如果您使用旧版本

throw new EntityNotFoundException();line vendor/doctrine/orm/lib/Doctrine/ORM/Proxy/ProxyFactory.php 之前将以下代码放入ProxyFactory类:177

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


小智 5

在您的实体中,您可以执行以下操作:

public function getSubmission(){
    if($this->Submission->getId()==0) return null;
    return $this->Submission;
}
Run Code Online (Sandbox Code Playgroud)