CakePHP 模型提供多種刪除資料的方法,理解 delete() 與 deleteAll() 的差異、級聯刪除機制與回呼函數,對於資料完整性與應用邏輯至關重要。
delete(int $id = null, boolean $cascade = true)
true當模型定義 hasMany 或 hasAndBelongsToMany 關聯,且關聯模型設定 'dependent' => true 時:
$cascade = true:同時刪除所有相依記錄(如 User 刪除時連同其 Recipes)$cascade = false:僅刪除主記錄,保留關聯資料若資料庫層面已定義 ON DELETE CASCADE 外鍵約束,資料庫引擎會優先處理,CakePHP 級聯邏輯將不會觸發。
使用 delete() 可觸發模型與行為的回呼:
beforeDelete:刪除前執行,回傳 false 可取消操作afterDelete:刪除後執行$this->Comment->delete($this->request->data('Comment.id'));
deleteAll(mixed $conditions, $cascade = true, $callbacks = false)
find()false,效能較佳)truefalsetrue// 不觸發回呼、不級聯
$this->Comment->deleteAll(array('Comment.spam' => true), false);
啟用 $callbacks 或 $cascade 時,CakePHP 會先查找符合條件的記錄再逐筆刪除,可能產生多條查詢,大量資料時需評估效能影響。
| 情境 | 建議方法 | 關鍵設定 |
|---|---|---|
| 單筆刪除、需觸發業務邏輯 | delete() | $cascade 視關聯而定 |
| 批次清理、無複雜回呼 | deleteAll() | $callbacks = false |
| 批次刪除、需級聯與回呼 | deleteAll() | $cascade=true, $callbacks=true |
| 資料庫已有外鍵級聯 | 任意 | 資料庫層面處理,CakePHP 不重複執行 |