ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2007-09-30

[][][] プラグインで実装できるからコーディングしないんだけど

自身のテーブル内で親子関係(ツリー構造)を表現するときに、こうすると良いよというサンプルが

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使うならプラグインで追加実装するのが一番のようです。

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |