确定是否需要基于getReference刷新托管实体

时间:2016-02-08 18:04:29

标签: php doctrine-orm

假设我有一个实体'应用程序' 以及其中一个应用程序''属性是类别(它对于哪种关联类型并不重要)。

因此,当我通过ID知道类别时,我可以调用类似的内容:

$category = $entityManager->getReference('Category', 1);
$application->setCategory($category);
$entityManager->flush();

getReference 将创建一个可以与我的应用程序一起设置为属性的代理。这样就可以在没有任何额外的SQL查询的情况下发送到数据库来获取/设置我的类别。

大!

但等等,当我尝试例如之后得到我的类别的名称,我该怎么办?我以为我是

 $category = $entity->getRepository('Category')->find(1);
 $name = $category->getName();

发生的事情是,我没有获得该名称,但却发现无法找到该实体的错误。

我可以通过明确地调用:

来解决这个问题
 $entityManager->refresh($category);

现在这将从数据库重新加载我的类别,现在我可以得到名称。

我的问题是:

是否有机会确定我是否仅提及类别或初始化/真实代理?

因为在我的情况下,有时我需要在检索对它的引用后访问类别,有时不需要。

如果我按照刷新'任何时候我都会执行不必​​要的SQL语句,我必须避免性能和

$entityManager->getUnitOfWork()->getEntityState($category)

无论如何都会提供MANAGED。

1 个答案:

答案 0 :(得分:0)

根据这个: https://stackoverflow.com/a/26257234/3784145 您可以检查引用是否是代理类的实例(Doctrine \ ORM \ Proxy \ Proxy)并相应地采取措施