Twig 和 Symfony2 - 找不到实体
Posted
技术标签:
【中文标题】Twig 和 Symfony2 - 找不到实体【英文标题】:Twig and Symfony2 - Entity was not found 【发布时间】:2013-06-24 15:45:43 【问题描述】:我有一个与其他一些实体相关的实体。 最后,我有一个像 tat 的对象:
paper.submission.authors
对于一些paper.submission,没有作者,在我的twig模板中,我在做:
% for author in paper.submission.authors
do something
% endfor %
对于没有作者的论文提交,我收到“找不到实体”异常。
你有没有可能在我的 for 循环之前测试对象是否存在。
我已经尝试过定义,它总是正确的。然后,我试过不为null,但这也产生了异常。
非常感谢您。
【问题讨论】:
你确定 paper.submission 总是设置好了吗? 【参考方案1】:问题
Doctrine 在找不到相关实体时抛出此异常。说起来好像多余,其实这很重要。 这意味着它可以找到与其相关的 ID,但提出的请求原则与任何结果都不匹配。
我的猜测是您的数据库表(实际上是链接表)submission.authors
包含 0
的 ID,而不是 NULL
。
这样一来,Doctrine 认为 IS 有一个 ID 为 0
的作者,因此找不到。
会发生什么
submission.authors
始终存在。它是一个未初始化 Doctrine Proxy。
var_dump($submission->getAuthors());
会告诉你究竟包含什么submission.authors
此时,不进行任何查询。它只是将带有标志isInitialized
的PersistentCollection
返回为false。
当您尝试从中获取属性时会发生异常
foreach ($submission->getAuthors() as $author)
当做这个学说时会检查getAuthors
是否被初始化。如果没有,它将运行以下查询
SELECT <stuffs> FROM authors WHERE id = 0;
返回不匹配并抛出EntityNotFound
异常
修复
您必须将 id 行的默认值设置为 NULL
并进行查询以将所有 0
更新为 NULL
。
有了这个,你可以很容易地用is not null
测试submission.authors
如果找到NULL
,Doctrine 将不会运行任何查询
【讨论】:
如果您的数据库表之一损坏,也会出现此错误。这有时会发生在我的 MISAM 表中。您可以通过修复相应的表来修复它:REPAIR TABLE yourTable
关系也会发生这种情况,我遇到了这个问题,我的实体“A”没有任何关系,但是另一个指向“A”的实体“B”有ManyToOne,此实体“B”在关系字段中有一些值为 0,因此导致了此错误。【参考方案2】:
如何调试才能找到未找到的相关实体?
在存储库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();
【讨论】:
对于识别错误非常有用【参考方案3】:在你的实体中,你可以做这样的事情:
public function getSubmission()
if($this->Submission->getId()==0) return null;
return $this->Submission;
【讨论】:
谢谢它对我有用。有时,我的实体 A 中有一个已定义的属性,但与实体 B 中的任何内容都不对应,即使我检查相关实体是否已定义,我的 twig 文件中也会出现此错误。以上是关于Twig 和 Symfony2 - 找不到实体的主要内容,如果未能解决你的问题,请参考以下文章
从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?