我有一个非常简单的结构化实体,其中包含一个简单的关联
Database_Entity_Tenant
id (primary key)
parentId (id of the parent entry)
code (a simple identifier for the tenant, unique)
我相应地在我的实体中定义了 parentId:
/**
* @Column(type="integer")
* @OneToOne(targetEntity="Tenant")
* @JoinColumn(name="parentTenantId", referencedColumnName="id")
* **/
protected $parentId;
这很好用——生成的数据库模式类似于我的选择,而且很好。
现在我正在编写我的第一个方法,它基本上必须以相反的顺序返回链接在一起的所有租户的数组(我使用它来向后遍历一系列租户)。
为了做到这一点,我想出了使用 while() 循环的想法。
$currentTenant = {DATABASE_ENTITY_TENANT}; // In my real code i fetch the entity object of the current tenant
$chain[] = $currentTenant;
$repository = Database::entityManager()->getRepository('Database_Entity_Tenant');
while(!$currentTenant->getParentId()){
$currentTenant = $repository->findOneBy(array(
'id' => $currentTenant->getParentId()
));
$chain[] = $currentTenant;
}
任何没有父租户(例如基本租户)的租户都将没有父 ID(或 null),因此这将结束 while 循环。
现在这一切都可能奏效,但对我来说似乎真的很粗糙。我对 Doctrine 很陌生,所以我不太了解它,但我相信有一些方法可以更优雅地做到这一点。
问题
Doctrine 2 是否为我提供了可以用来以更好的方式解决上述问题的任何功能集?
如果没有,那么还有其他方法可以更优雅地做到这一点吗?