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

ThinkPHP create() 方法深度解析:隱藏的 $type 參數與主鍵判斷陷阱

     編輯:PHP 相關知識

create() 方法內部隱藏第二參數 $type,控制「新增/更新」判斷邏輯:1=MODEL_INSERT、0=MODEL_UPDATE。默認根據數據中是否包含主鍵自動判斷,導致手動指定主鍵值時誤判為更新,進而使自動完成(insert 時機)失效。

核心判斷邏輯

$type = $type ? $type : (!empty($data[$this->getPk()]) ? self::MODEL_UPDATE : self::MODEL_INSERT);

陷阱復現場景

// 模型定義:主鍵為 student_id(非自增,業務生成)
protected $_auto = [
    ['majorid', 'maxmajoridadd1', 1, 'callback'], // 1 = 僅新增時執行
];

// 控制器調用
$data['student_id'] = '20230001'; // 手動指定主鍵
M('Student')->create($data);      // 系統判斷有主鍵 → UPDATE → 自動完成不執行!

解決方案:顯式指定 $type=1

M('Student')->create($_POST, 1); // 強制聲明為 INSERT 操作

自動驗證/完成失效兩大核心原因

  1. 主鍵手動賦值導致類型誤判 → 用 create($data, 1) 修正
  2. Model 類名稱拼寫錯誤 → 多字母/少字母導致載入失敗,檢查文件名與類名一致性

完整調用簽名

create(mixed $data = '', mixed $type = '')
// $data: 表單數據,空則自動獲取 $_POST
// $type: 操作類型,1=新增,0=更新,空=自動判斷

最佳實踐建議

  • 非自增主鍵業務務必顯式傳 1
  • 封裝基礎 Model 類,重寫 create() 增加日誌或強制類型
  • 單元測試覆蓋「有主鍵/無主鍵」兩種調用路徑
  • 自動完成條件:1新增、2更新、3全部,按業務精確設置

調試技巧

// 臨時開啟 SQL 日誌查看實際操作
$model = M('Student');
$model->create($data, 1);
echo $model->getLastSql(); // 確認是 INSERT 還是 UPDATE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved