Yii 1.x 提供兩種主要方式修改資料庫記錄:類別層級的 updateByPk() 與實例層級的 update()。本文詳細說明兩者用法、參數與適用場景。
<?php
/* 參數說明:
* $id 主鍵值(單一或陣列)
* $attributes 欲更新的欄位陣列 ['欄位'=>值, ...]
* $condition 額外 WHERE 條件(可選)
* $params 條件參數綁定(可選)
*/
$count = Model::model()->updateByPk($id, $attributes, $condition, $params);
if ($count > 0) {
echo '修改成功,影響 ' . $count . ' 筆';
} else {
echo '修改失敗或無資料符合';
}
?>
特點:
<?php
$model = Model::model()->findByPk($id); // 先載入
if ($model) {
$model->username = 'yiistudy';
$model->password = 'mysql';
// 僅更新指定欄位(可選),否則更新所有髒屬性
$count = $model->update(['username', 'password']);
if ($count > 0) {
echo '修改成功';
} else {
echo '修改失敗';
}
} else {
echo '找不到對應記錄';
}
?>
特點:
findByPk() 載入,觸發 afterFind 等事件。rules()),save() 會自動驗證;update() 可指定欄位略過驗證。isNewRecord 區分 INSERT/UPDATE。| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 簡單批次更新、無需驗證/事件 | updateByPk() | 效能較好、程式碼簡潔 |
| 表單編輯、需驗證、觸發事件 | 實例 update()/save() | 完整生命週期、資料完整性 |
| 條件複雜、非主鍵條件更新 | updateAll() | 類別層級支援任意 WHERE |
補充:updateAll($attrs, $condition, $params) 可依任意條件批次更新,updateCounters() 專用於計數器欄位原子遞增/遞減。