我有一个Person
和Admin
实体。一个Person
只能有一个Admin
,但我不需要一直管理。当我列出所有与管理员相关的人时,条令将从DB加载所有管理员。为什么会发生这种情况?
在一对一关联的情况下(以及在类似的情况下,例如懒惰加载一对多关联时(,Doctrine为关联实体生成所谓的代理对象。这些代理对象模拟目标实体的接口,但仅在访问non-id字段时触发从数据库加载实际数据。
因此,在您获取Person
实体列表的情况下,您不会从数据库中获取Admin
实体的列表,而是接收Admin
代理的列表。除非您(偶尔或有意(尝试访问Admin
实体的某些属性(可以安全访问的id
除外(,否则Doctrine不会尝试从数据库中获取任何Admin
信息。
考虑以下具有一对一关联的A
和B
实体的简化设置:
// 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
。