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并进行查询以将所有内容更新0为NULL.
有了这个,你可以轻松地测试submission.authors与is not null
如果发现,则Doctrine不会运行任何查询 NULL
如何调试以找到未找到的相关实体?
存储库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)