0

複数のルートを持つ doctrine beahaviour NestedSet を使用してテーブルのツリー構造を作成するためにリファクタリングしている Doctrine 1.2 プロジェクトがあります。

私が必要としているのは、祖先から子孫への継承 (OO の常識ではありません) であり、子孫は、自身のプロパティが欠落している最も近い祖先からプロパティを継承します。関係でも同じことが起こります。

例を挙げて説明しましょう:

Category:
  actAs:
    NestedSet:
      hasManyRoots: true
      rootColumnName: root_id
  columns:
    name: string(50)
    another_property: string(50)
    active: boolean
Tag:
  columns:
    value: string(50)
CategoryTag:
  columns:
    category_id: integer
    tag_id: integer

私が実行したいのは:

  • カテゴリがアクティブかどうかを取得します。つまり、すべての先祖がアクティブかどうかを確認します
  • 特定のカテゴリで another_property が欠落している場合は、存在する最も近い祖先から継承します
  • 特定のカテゴリのタグを取得します。タグが欠落している場合は、最も近い祖先から取得します

速度と柔軟性を最大化するための最善のアプローチとして何を提案しますか?

4

1 に答える 1

0

まあ、これは非常に単純です。次のように、必要な関係を持つツリーを取得するだけです。

    class ModelTable extends Doctrine_Table
    {
      /**
       * Gets tree element in one query
       */
      public function getModelTree()
      {

        $q = $this->createQuery('g')
          ->leftJoin('g.Tags t')
          ->orderBy('g.root_id')
          ->addOrderBy('g.lft')
          ->where('g.root_id NOT NULL')
;
        return $q->execute(array(),  Doctrine_Core::HYDRATE_ARRAY_HIERARCHY);
      }
    }

次に、次のようにレンダリングできます。

<?php function echoNode($tree, $parent=null) { ?>
  <ul>
  <?php foreach ($tree as $node): ?>
    <li data-property='<?php echo false != $node['property'] ? $node['property'] : $parent['property']  ?>'>
      <?php echo $node['name'] ?>
      <?php if (count($node['__children']) > 0): ?>
        <?php echo echoNode($node['__children'], $node) ?>
      <?php endif; ?>
    </li>
  <?php endforeach; ?>       
  </ul>
<?php } ?>

<?php echo echoNode($tree) ?>

親ノードが存在しない場合、親ノードから「プロパティ」を取得する方法に注意してください。この問題に対処する別の方法は、Doctrine_Core::HYDRATE_RECORD_HIERARCHY を使用することです。これにより、ループ時に $nodes でメソッドを呼び出すことができます。たとえば、Model::getClosestProperty() メソッドを作成して、最も近い親からプロパティを取得できます。ただし、これはアレイ ハイドレーションほど効率的ではありません。

于 2011-05-12T15:39:52.993 に答える