是什么原因导致条令中的一对一关系不能懒惰加载



我有一个PersonAdmin实体。一个Person只能有一个Admin,但我不需要一直管理。当我列出所有与管理员相关的人时,条令将从DB加载所有管理员。为什么会发生这种情况?

在一对一关联的情况下(以及在类似的情况下,例如懒惰加载一对多关联时(,Doctrine为关联实体生成所谓的代理对象。这些代理对象模拟目标实体的接口,但仅在访问non-id字段时触发从数据库加载实际数据。

因此,在您获取Person实体列表的情况下,您不会从数据库中获取Admin实体的列表,而是接收Admin代理的列表。除非您(偶尔或有意(尝试访问Admin实体的某些属性(可以安全访问的id除外(,否则Doctrine不会尝试从数据库中获取任何Admin信息。

考虑以下具有一对一关联的AB实体的简化设置:

// A.php
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity()
*/
class A
{
/**
* @var integer
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var B
* @ORMOneToOne(targetEntity="AppEntityB")
*/
private $b;
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return B
*/
public function getB(): B
{
return $this->b;
}
}
// B.php
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity()
*/
class B
{
/**
* @var integer
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string|null
* @ORMColumn(type="string", nullable=true)
*/
private $name;
}

您可以通过查看调试器或使用反射来证明A::$b包含代理对象:

$entities = $this->getEntityManager()->getRepository(AppEntityA::class)->findAll();
/** @var AppEntityA $a */
$a = array_shift($entities);
$class = (new ReflectionObject($a->getB()))->getName();

在这种情况下,$class变量的值将是Proxies__CG__AppEntityB(AppEntityB的条令代理对象(,而不是像在正常实体对象的情况下那样的AppEntityB

相关内容

  • 没有找到相关文章

最新更新