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 此时,不进行任何查询。它只是将带有标志isInitializedPersistentCollection 返回为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 - 找不到实体的主要内容,如果未能解决你的问题,请参考以下文章

在 Twig 中解码 JSON

从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?

Symfony2:学说“找不到驱动程序”

使用 Assetic / Twig / Symfony2,我可以定义前端库吗?

使用 Symfony2/Twig 创建引导轮播

如何在 Symfony2 中获取代表当前用户的实体?