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}

ってのもあるだろうけど、タイピング数が増えてしまうので、それはどうかな。