Destoon 的 tag 標籤支援 table 參數指定多表,自動生成 JOIN SQL;複雜業務邏輯則可用自定義 PHP 函式配合 $db 物件實現。本文詳解兩種方案適用場景、語法細節與效能考量。
{loop $tags $v}
{/loop}
{loop $tags $v}
table=表1 別名1, 表2 別名2:必須給別名,後續欄位引用用 別名.欄位&prefix=:留空表示表名已含前綴,或手動指定 &prefix=destoon_&condition=:JOIN 條件 + WHERE 條件合寫,如 m.userid=c.userid AND c.groupid=17{$v['欄位']} 或 {$v.欄位}(若欄位名無衝突){$v['m.userid']}、{$v['c.userid']}
{loop $tags $t}
{$t[title]}
{$t[content]}
{/loop}
include/custom.func.php 或模組 common.inc.php 定義函式{php $data = getCustomData($param);}{loop $data $v} 輸出// include/custom.func.php
function getSellByUser(string $username, int $limit = 6): array {
global $db;
$list = [];
// 使用參數化查詢防注入
$result = $db->query("
SELECT * FROM {$db->pre}sell
WHERE username = ?
ORDER BY addtime DESC
LIMIT 0, ?
", [$username, $limit]); // 注意:Destoon $db->query 不直接支援參數化,實際需用 prepare/execute
// 正確寫法(PDO 風格)
$stmt = $db->prepare("
SELECT * FROM {$db->pre}sell
WHERE username = ?
ORDER BY addtime DESC
LIMIT ?
");
$stmt->execute([$username, $limit]);
while ($r = $stmt->fetch(PDO::FETCH_ASSOC)) {
$list[] = $r;
}
return $list;
}
// 模板調用
{php $sells = getSellByUser($username, 8);}
{loop $sells $v}
{$v[title]}
{/loop}
| 維度 | tag 多表 JOIN | PHP 自定義函式 |
|---|---|---|
| 開發效率 | 高(累模板配置) | 中(需寫 PHP、部署) |
| SQL 複雜度 | 簡單 JOIN、單層 WHERE | 任意複雜(子查詢、UNION、CTE、窗口函式) |
| 效能調優 | 難控制執行計劃 | 可精確控制索引、分頁優化、快取策略 |
| 安全性 | condition 參數需防注入 | 原生參數化查詢,天然防注入 |
| 除錯難度 | SQL 隱藏在標籤中 | 可直接 var_dump SQL、EXPLAIN |
| 快取整合 | 依賴模板快取機制 | 可接入 Redis/Memcached 任意快取層 |
| 適用場景 | 前端展示類、簡單關聯、快速迭代 | 核心業務、複雜報表、高併發、需精確控制 |
tag 標籤,開發快、維護成本低{loop $data $v}tag 的 condition 參數嚴禁直接拼接變數,若必須動態,請在 PHP 預處理後傳入安全值SELECT 具體欄位 而非 SELECT *,並用別名區分