上位からn番目の親ドキュメントのデータを取得したい場合 | MODxでハマるありがちな罠と解決法

上位からn番目の親ドキュメントのデータを取得したい場合

以下のようなドキュメント構成で、上位からn番目の親ドキュメントのテンプレート変数の値を取得したい場合があるとします。
例えば、各ジャンルごとに入っている最下層のBLOGのドキュメント(2010/01/10分など)から、ジャンル名を取得したいとします。テンプレートは各階層毎に同一です。

・TOP
 ・ジャンルA
  ・BLOGコンテナA
   ・2010/01/10
   ・2010/01/11
  ・BLOGコンテナB
   ・2010/01/10
   ・2010/01/11
 ・ジャンルB
  ・BLOGコンテナA
   ・2010/01/10
   ・2010/01/11

この場合、手段としては二つあります。
・GetFieldのネストで取得する方法。
 [[GetField? &parent=`1` &topid=[[GetField? &parent=`1` &field=`id`]] &field=`取得するテンプレート変数名`]]
・UltimateParentで2番目の親ドキュメントIDを取得し、GetFieldのdocidに指定し取得する方法。
 [[GetField? &docid=`[[UltimateParent? &topLevel=`2`]]` &field=`取得するテンプレート変数名`]]

どちらも同じように取得できますが、GetFieldで親ドキュメントを取得すると、DBアクセスの頻度が極端に増大します。

UltimateParentでドキュメントIDを取得し、GetFieldでそのIDを用いて取得する方がパフォーマンス向上につながります。
[[GetField? &parent=`1` &field=`取得するテンプレート変数名`]]
よりも
[[GetField? &docid=`[[UltimateParent? &topLevel=`1`]]` &field=`取得するテンプレート変数名`]]
の方がクエリ回数は少ないです。
#恐らく、UltimateParentはシステム変数のツリールート構造を取得しているはず。ソース追っかけてませんけどね。
#[^q^] で表示されるクエリー発行回数を見ながら調整してたら、劇的に数値が改善されたので。


上位からn番目の親ドキュメントのデータを取得したい場合
最終更新日
2010.02.09 (火)
最終更新者
Takayuki Hirosawa