0

我有一个非常简单的结构化实体,其中包含一个简单的关联

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 是否为我提供了可以用来以更好的方式解决上述问题的任何功能集?

如果没有,那么还有其他方法可以更优雅地做到这一点吗?

4

1 回答 1

0

如果我没有弄错你的问题,你只需要在你的关联表中找到所有由parentId. 在 Doctrine2 中,您可以执行以下操作:

$currentTenant = {DATABASE_ENTITY_TENANT}; // assuming a valid entity

$repository = Database::entityManager()
    ->getRepository('Database_Entity_Tenant')
    ->createQueryBuilder('t')
    ->where('t.parentId IS NOT NULL')
    ->andWhere('t.parentId < :current') /* < or > */
    ->setParameter('current', $currentTenant->getParentId()->getId())
    ->orderBy('t.parentId', 'ASC') /* ASC or DESC, no array_reverse */
    ->getQuery()
    ->getResult();

/* At this point $repository contains all what you need because of Doctrine,
 * but if you want a chain variable: */

$chain = array();
foreach ($repository as $tenant) {
    $chain[] = $tenant->getCode(); // your tenant entity if your entity is mapped correctly
}

希望这可以帮助!

于 2013-09-17T22:08:36.997 回答