我对处理学说的延迟加载机制的正确方法有疑问。我有一个通过@ManyToOne 引用另一个实体的实体:
class Entity {
...
/**
* @ManyToOne(targetEntity="AnotherEntity")
* @JoinColumn(name="anotherEntityId", referencedColumnName="id")
*/
protected $anotherEntity;
...
}
class AnotherEntity {
/**
* @var integer $id
* @Column(name="id", type="integer", nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $someValue
* @Column(name="someValue", type="string")
*/
private $someValue;
...
}
Doctrine 现在为 AnotherEntity 生成一个代理,该代理在其 getter 上实现延迟加载:
public function getSomeValue()
{
$this->__load();
return parent::getSomeValue();
}
如果我现在有一些 Entity 实例没有 AnotherEntity 的引用对应项($anotherEntityId 为 0 或 null)。然后学说似乎生成了另一个实体的一个空对象,并使所有实体对象的 $anotherEntity 变量都指向它。空对象未初始化,因为我们想要延迟加载。当我这样做时,我现在得到一个 EntityNotFoundException :
$entiy->getAnotherEntity()->getSomeValue();
那太棒了!我访问的另一个实体在数据库中不存在,所以我得到了这个异常。但是当我对第二个实体(以及之后的所有其他实体)执行相同操作时,我没有得到这个异常,因为它们都指向另一个实体的同一个实例,并且学说在第一次调用中将其标记为已初始化。所以现在我正在访问一个逻辑上不存在但没有出现任何异常的对象 - 我只是从 getSomeValue() 中获取未初始化的变量,例如一个空字符串。
您知道如何让我的应用程序识别出该对象不存在,而不仅仅是接受空值吗?