プラグインで実装できるからコーディングしないんだけど
自身のテーブル内で親子関係(ツリー構造)を表現するときに、こうすると良いよというサンプルが
Managing Hierarchical Data in MySQL(dev.mysql.com)で紹介されています。
ここでツリー構造を取得するSQLが次のように紹介されてます。
SELECT node.name, (COUNT(parent.name) - 1) AS depth FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name ORDER BY node.lft;
単純にこれと同じクエリをPropel(1.2系)で実装するどうなるんだろうと。。
ちなみにbetweenはそのまま指定できないので他の演算子で実装しています。
$c = new Criteria(); ## SELECT $c->clearSelectColumns(); $c->addSelectColumn('node.name'); $c->addAsColumn( 'depth', '(COUNT(parent.name) -1)'); ## FROM $c->addAlias('node', self::TABLE_NAME); $c->addAlias('parent', self::TABLE_NAME); ## WHERE $criterion = $c->getNewCriterion('node.lft' , 'node.lft >= parent.lft', Criteria::CUSTOM); $criterion->addAnd($c->getNewCriterion('parent.lft' , 'node.lft <= parent.rgt', Criteria::CUSTOM)); $c->add($criterion); ## GROUP BY $c->addGroupByColumn('node.name'); ## ORDER BY $c->addAscendingOrderByColumn('node.lft'); $rs = self::doSelectRS($c); $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
このCriteriaをみて直感で分かる人のほうが少ないような。。と正直感じますが。。
そして、上記を実行した結果発行されたSQLは以下のとおり。
SELECT node.name, (COUNT(parent.name) -1) AS depth FROM ec_category node, ec_category parent WHERE (node.lft >= parent.lft AND node.lft <= parent.rgt) GROUP BY node.name ORDER BY node.lft;
ちなみにgetNewCriterionでCriteria::CUSTOMを指定した場合は第1引数って飾りで意味ないのかなって思っていましたが、今回のように、addAliasでテーブルを追加するときに、追加したテーブルのエイリアス名を使用して第1引数を指定しないとFROM句にエイリアスが追加されませんでした。
というわけで、node.lftとparent.leftとエイリアス名を各々で指定しています。
ただ、symfonyではsfPropelActAsNestedSetBehaviorPluginというこれらのツリー構造を実装するためのプラグインが用意されてます。symfony使うならプラグインで追加実装するのが一番のようです。