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

ThinkPHP M 方法詳解:基礎模型實例化、跨庫操作、表前綴與連接參數動態指定

     編輯:PHP 相關知識

ThinkPHP M 方法詳解:基礎模型實例化、跨庫操作、表前綴與連接參數動態指定

M() 是 ThinkPHP 實例化基礎模型(Think\Model)的快捷函數,對比 D()(實例化自定義模型類),M() 無需定義模型類文件、IO 開銷小、性能更高、支援動態指定數據庫連接參數,是輕量級 CURD 操作的首選。

M vs D 核心差異

特性M()D()
模型類基礎 Model 類自定義模型類 (Model/Logic/Service)
業務邏輯封裝不支援支援(在模型類中定義方法)
文件 IO無需加載模型類文件
性能高略低
跨項目調用支援需複製模型類
動態指定表前綴/數據庫支援不支援(模型類屬性固定)
單例模式支援支援

調用語法

M('[基礎模型類:]模型名', '表前綴', '數據庫連接信息')

1. 最簡單用法:實例化基礎模型

$User = M('User'); // 操作 think_user 表(默認前綴 think_)
$list = $User->select(); // 直接調用 CURD 方法

等效於 new Model('User')。模型名自動轉小寫加前綴:User → think_user。

2. 實例化其他公共基礎模型類

$User = M('CommonModel:User'); // 使用 CommonModel 基礎類
// 等效 new CommonModel('User')
// CommonModel 需繼承 Model,可封裝通用邏輯(如軟刪除、自動時間戳)

適用於:項目表量大(100+),大多數表僅需基本 CURD,少數複雜表用 D() 定義專屬模型。

3. 動態指定表前綴

// 使用項目配置前綴(默認)
$User = M('User'); // think_user

// 指定自定義前綴
$User = M('User', 'custom_'); // custom_user

// 無前綴表
$User = M('User', null); // user
$User = M('User', '');   // user

4. 跨數據庫操作

// 操作 db2 數據庫的 think_user 表
$User = M('db2.User', 'think_');

// 操作 db1 數據庫的無前綴 user 表
$User = M('db1.User', null);

格式:數據庫配置名.模型名。數據庫配置需在配置文件預定義:

// config.php
'DB_CONFIG' => [
    'db1' => 'mysql://user1:pass@localhost:3306/db1',
    'db2' => 'mysql://user2:pass@localhost:3306/db2',
]

5. 動態指定數據庫連接參數(DSN/數組/配置引用)

// 完整 DSN 字符串
$User = M('User', 'think_', 'mysql://user_a:1234@localhost:3306/thinkphp');

// 配置文件引用
$User = M('User', 'think_', 'DB_CONFIG'); // 引用配置項

// 數組格式
$User = M('User', 'think_', [
    'db_type'  => 'mysql',
    'db_host'  => '192.168.1.100',
    'db_name'  => 'thinkphp',
    'db_user'  => 'readonly',
    'db_pwd'   => 'secret',
    'db_port'  => 3306,
    'db_charset' => 'utf8',
]);

6. 進階組合:公共模型類 + 跨庫 + 自定義前綴

$User = M('CommonModel:db2.User', 'think_');
// 使用 CommonModel 基礎類,操作 db2 數據庫 think_user 表

7. 分層模型替代方案

若需實例化 Logic/Service 分層模型:

M('UserLogic:User'); // 實例化 UserLogic
// 推薦用 D() 更語義化:
D('User', 'Logic');

8. 實戰場景選型建議

  • 通用 CURD、無業務邏輯、跨模塊/項目調用、動態庫表 → M()
  • 複雜業務邏輯、自動驗證/完成、事件回調、關聯模型 → D() 定義專屬模型類
  • 大型項目混合策略:90% 表用 M(),10% 核心表用 D()

9. 避坑指南

  1. 模型名大小寫:傳入 'User' 實際操作 think_user,數據庫表名建議全小寫
  2. 單例特性:同一請求多次 M('User') 返回同一實例,屬性修改會殘留
  3. 跨庫事務:M() 實例化不同庫模型,startTrans() 無法跨庫,需分布式事務方案
  4. 字段緩存:首次查詢會緩存字段信息,結構變更需清理 Runtime/Cache/ 或 $model->flush()

M() 以極簡 API 提供了強大的動態數據訪問能力,是 ThinkPHP 輕量級開發的利器。理解其參數機制、單例行為、跨庫邏輯,能讓你在性能與靈活性間遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved