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

ThinkPHP 多表查詢三大方案:視圖模型、JOIN、table 方法完整教學

     編輯:PHP 綜合知識

場景:三張表關聯查詢

  • pl (評論) - uid, content
  • user (用戶) - id, username
  • lyb (留言板) - uid, title

方案一:視圖模型 (ViewModel) - 推薦

class PlViewModel extends ViewModel {
    public $viewFields = [
        'pl'  => ['uid', 'rid', 'content'],
        'user'=> ['id', 'username', '_on' => 'pl.uid=user.id'],
        'lyb' => ['uid'=>'lid', 'content'=>'lyb_content', 'title', '_on' => 'pl.uid=lyb.uid'],
    ];
}

控制器調用:

$list = D('PlView')->field('uid,title,username,lyb_content')->select();
// 若有重複資料:->group('pl.uid')

方案二:JOIN 方法 (連貫操作)

$list = D('pl')
    ->join('lyb ON pl.uid = lyb.uid')
    ->join('user ON pl.uid = user.id')
    ->field('user.username, lyb.title, pl.content')
    ->select();

JOIN 類型:INNER JOIN (預設)、LEFT JOIN、RIGHT JOIN、FULL JOIN,可在 join() 字串指定。

方案三:table 方法 (指定多表)

$list = D('pl')
    ->field('pl.content, user.username, lyb.title')
    ->table('pl, lyb, user')
    ->where('pl.uid=user.id AND pl.uid=lyb.uid') // 必須手寫 WHERE 關聯條件
    ->limit(10)
    ->select();

注意:table() 預設查所有欄位,需用 field() 限制,且需自行寫關聯條件,易出錯。

方案對比與選擇建議

方案優點缺點適用場景
ViewModel定義一次複用、自動處理關聯、支援關聯預載入需建立模型類別固定關聯、常用查詢、專案中大型報表
JOIN靈活、SQL 可見、支援各種 JOIN 類型複雜關聯 SQL 字串長、欄位衝突需別名臨時查詢、動態關聯條件
table()簡單、無需模型手寫 WHERE 易錯、不支援關聯預載入極簡單雙表、快速原型

進階:關聯預載入

// 模型定義關聯
class PlModel extends Model {
    protected $_link = [
        'user' => ['mapping_type' => BELONGS_TO, 'foreign_key' => 'uid', 'mapping_fields' => 'username'],
        'lyb'  => ['mapping_type' => BELONGS_TO, 'foreign_key' => 'uid', 'mapping_fields' => 'title'],
    ];
}

// 控制器
$list = D('Pl')->relation(true)->select(); // 自動帶入 user、lyb 關聯資料
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved