0

単純な関連付けを含む非常に単純な構造のエンティティがあります

データベース_エンティティ_テナント

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 に答える