Smartyの拡張プラグインを使ってみるとか
ほぼ自分用覚書。
例えば、
* テーブル category、フィールドは id, name
* テーブル item、フィールドは id、category_id、name
* category と item は 1 対 n
とする。
このとき、item 一覧に category 名称をくっつけて表示しようとするとこんなSQLになる。
[sql]
SELECT
T.*,
T2.name category_name
FROM
item T
INNER JOIN
category T2
ON
T2.id = T.category_id[/sql]
で、こういうSQLを頻繁に書くのはなんだかしんどい。
ので、DB側は SELECT * FROM item とだけしておいて、category名称の参照は Smarty の 拡張プラグインで対応することにする。
[php] <?php /* * function.category.php / function smarty_function_category($param, & $smarty) {
static $dbh = NULL;
static $cache = NULL;
if (!isset($param['id'])) {
return '';
}
$id = $param['id'];
if ($cache === NULL) {
$cache = new Cache_Lite();
}
$key = "category:{$id}";
$res = $cache->get($key);
if ($res !== FALSE) {
return $res;
}
if ($dbh === NULL) {
$dbh = MDB2::factory(DSN);
$dbh->setFetchMode(MDB2_FETCHMODE_ASSOC);
$dbh->loadModule('Extended');
}
$sql = 'SELECT * FROM category WHERE id = ?';
$res = $dbh->getRow($sql, NULL, array($id));
$name = '';
if (!empty($res)) {
$name = $res['name'];
}
$cache->save($name, $key);
return $name;
}[/php]
こうしておけば、
{category id=$id}
で、category 名称を表示できる。
おそらく 「ほげほげ名称だけを表示する為だけにINNER JOIN を使用する」というケースはよくあることだと思うので、
(少なくとも今自分が関わっている案件は)
こうしてしまってテンプレート側で対応するほうがラクな気がするがどうだろ。
もう少し別の書き方・・・、
{dbvalue tbl="catgory" field="name" id=$id}
ってのもあるだろうけど、タイピング数が増えてしまうので、それはどうかな。