假设我有一个实体'应用程序' 以及其中一个应用程序''属性是类别(它对于哪种关联类型并不重要)。
因此,当我通过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。
答案 0 :(得分:0)
根据这个: https://stackoverflow.com/a/26257234/3784145 您可以检查引用是否是代理类的实例(Doctrine \ ORM \ Proxy \ Proxy)并相应地采取措施