首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Destoon 多表查詢實戰:tag 標籤 SQL JOIN 與自定義函式兩種方案

     編輯:PHP 相關知識

Destoon 多表關聯查詢:tag 標籤 JOIN 語法與 PHP 自定義函式完整對比

Destoon 的 tag 標籤支援 table 參數指定多表,自動生成 JOIN SQL;複雜業務邏輯則可用自定義 PHP 函式配合 $db 物件實現。本文詳解兩種方案適用場景、語法細節與效能考量。

方案一:tag 標籤多表 JOIN(宣告式、適合簡單關聯)

語法結構


{loop $tags $v}
    
{/loop}

實例:會員表 + 公司表關聯



{loop $tags $v}
    
  • {/loop}

    關鍵點解析

    • 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}

    方案二:PHP 自定義函式(程式化、適合複雜邏輯/效能優化)

    實現步驟

    1. 在 include/custom.func.php 或模組 common.inc.php 定義函式
    2. 模板中呼叫 {php $data = getCustomData($param);}
    3. {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 多表 JOINPHP 自定義函式
    開發效率高(累模板配置)中(需寫 PHP、部署)
    SQL 複雜度簡單 JOIN、單層 WHERE任意複雜(子查詢、UNION、CTE、窗口函式)
    效能調優難控制執行計劃可精確控制索引、分頁優化、快取策略
    安全性condition 參數需防注入原生參數化查詢,天然防注入
    除錯難度SQL 隱藏在標籤中可直接 var_dump SQL、EXPLAIN
    快取整合依賴模板快取機制可接入 Redis/Memcached 任意快取層
    適用場景前端展示類、簡單關聯、快速迭代核心業務、複雜報表、高併發、需精確控制

    最佳實踐建議

    1. 前端列表、簡單關聯: 優先用 tag 標籤,開發快、維護成本低
    2. 核心交易、複雜報表、高併發: 必須用 PHP 函式 + 參數化查詢 + 快取
    3. 混合模式: PHP 函式準備資料,模板只負責渲染 {loop $data $v}
    4. SQL 注入防護: tag 的 condition 參數嚴禁直接拼接變數,若必須動態,請在 PHP 預處理後傳入安全值
    5. 欄位衝突: 多表查詢務必用 SELECT 具體欄位 而非 SELECT *,並用別名區分
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved