今天在開發的過程中,遇到使用框架的 delete 方法刪除數據失敗。
原因
判斷應該是使用了軟刪除的問題(即 使用了 SoftDelete 這個 trait)
通過代碼追蹤,找到以下原因:
// 在 \think\db\Query::delete() 方法 // 作者在底層代碼中為了兼容 軟刪除做了一些邏輯,把 解析出來的 soft_delete 選項的條件做為 update 的數據了 // 通過打印 下面的 $this->options['soft_delete'] 得出是 一個條件表達式的 二維數組 /* [ [0] => "__TABLE__.delete_time", [1] => [ [0] => "=" [1] => 0 ] ] */ // 最終 又將條件作為 更新的數據 去做 update 操作,最終在生成sql 的時候,語句為空字符串,就造成了 刪除無效的情況
// 解決辦法
// 在使用 SoftDelete trait 的模型類里,自定義封裝一個 刪除的方法
// 在輸入where條件后,
// 通過鏈式操作 修改 options 屬性的 soft_delete 元素 (注意:如果直接通過 $this->setOption 非鏈式 修改options 是沒有用的)
// 最終再調用 底層的delete 方法就可以了
// PS: 截圖中最后的代碼 self::where 或者 $this->where 都可以,因為不管是靜態調用或者對象調用,在模型底層都是通過魔術方法來實現的