上位から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^] で表示されるクエリー発行回数を見ながら調整してたら、劇的に数値が改善されたので。


作成日
2010.01.10 (日)
最終更新日
2010.02.09 (火)
作成者
Takayuki Hirosawa
  • speed_fish 引っ越ししてからつなげていなかったとても古いnetgearのnas。今日つなげようとしたらlan経由で全くつながらず。windows10が勝手にsmb1を切り捨ててたと判明するまでに3時間。httpでもpingでもつながるのにos… https://t.co/Ejd7om16t0 2018-04-24 11:41:09
  • speed_fish modxからevoが切り離しかー。まあrevoとはもう別物感溢れてたし良いんじゃないでしょうか。やりやすくなるといいなー。 2017-04-28 20:33:09
  • speed_fish Chromeの57から頻発している、ERR_BLOCKED_BY_XSS_AUDITOR。試してみたけど、hidden含め入力項目にJavaScriptが入っても発生。HTTPS化していないフォームはまあ当然発生かな。 2017-04-10 18:00:57
  • speed_fish modxサイトをcloudflare化でeFormで引っかかる。中身みたらsite_urlでリファラーチェックしてました。ssl flexibleを使おうとしてたので、eFormを改造。パラメータにsiteurlを追加しましたとさ。#modx #cloudflare #eform 2017-03-04 00:44:09
  • speed_fish メモメモ。MODxでAMP対応するスニペット。 GETのURLが気に食わないのでリライトかな。 https://t.co/Oa9qzQ5dOr 2017-02-03 01:10:54