SQLToolsプラグイン(その6・可変長プレースホルダ)

SQLToolsプラグインで検索する場合、状況に応じてパラメータの数を変えたいこともあります。
このようなときには、可変長のプレースホルダを使うことができます。

1.可変長のプレースホルダが必要な場合

例えば、IDが1番のブログから、いくつかのカテゴリの中のどれかに属する記事を読み込みたいとします。
また、カテゴリの数は、状況に応じて変わるとします。

記事をMTSQLObjectsタグで出力する場合、カテゴリのIDをプレースホルダで表すとすれば、以下のようなSQLを組みます。

SELECT DISTINCT entry_id
FROM mt_entry, mt_placement
WHERE entry_id = placement_entry_id
AND entry_class = 'entry'
AND entry_blog_id = 1
AND entry_status = 2
AND placement_category_id IN (?, ?, ..., ?)

このSQLの最後の「?, ?, ..., ?」の部分は、カテゴリの数に応じて、「?」の数が変わり、可変長のプレースホルダが必要になります。
例えば、カテゴリが3つなら、「?, ?, ?」と「?」を3回書きます。

2.placehokdersモディファイアに配列を渡す

当プラグインでは、可変長のプレースホルダを、以下のように処理します。

  • SQL側では、可変長のプレースホルダを「?」1個で表します。
  • MTSQLObjectsタグ等のplaceholdersモディファイアでは、プレースホルダに渡す値として、配列変数を指定します。

例えば、1.であげた例で、IDが3/4/5のどれかのカテゴリに属する記事を読み込みたいとします。
この場合、SQLは以下のように入力しておきます。
可変長の「?, ?, ..., ?」の部分を、「?」1個に置き換えます。

SELECT DISTINCT entry_id
FROM mt_entry, mt_placement
WHERE entry_id = placement_entry_id
AND entry_class = 'entry'
AND entry_blog_id = 1
AND entry_status = 2
AND placement_category_id IN (?)

一方、テンプレート側では、MTSQLObjectsタグの部分を以下のように組みます。
カテゴリのIDを配列変数(この例ではcat_ids)に代入し、その配列変数をplaceholdersモディファイアに渡します。

<$mt:SetVar name="cat_ids" index="0" value="3"$>
<$mt:SetVar name="cat_ids" index="1" value="4"$>
<$mt:SetVar name="cat_ids" index="2" value="5"$>
<mt:SQLObjects name="○○○" type="entry" placeholders="$cat_ids">
  ...
</mt:SQLObjects>