## 刪除記錄:destroy( )
#### 1. 功能:根據條件從數據表中刪除數據。
>[info] ThinkPHP5 推薦使用這個方法刪除數據。
****
#### 2. 源碼:/thinkphp/library/think/Model.php
>[info] 源碼本身并無注釋,下面代碼注釋為本人所加,以便于讀者學習。
~~~~
/**
* 刪除記錄
* @access public
* @param mixed $data 主鍵列表 支持閉包查詢條件
* @return integer 成功刪除的記錄數
*/
public static function destroy($data)
{
//很多靜態方法中都能看到這個語句:實例化調用此方法的類
$model = new static();
$query = $model->db(); //獲取數據庫連接實例
//如果參數為數組并且是關聯數組(元素鍵名不為0)
if (is_array($data) && key($data) !== 0) {
//將數組做為條件表達式
$query->where($data);
$data = null; //清空本次查詢條件
} elseif ($data instanceof \Closure) { // 如果不是數組,則視為閉包查詢
//自動調用自定義的閉包函數
call_user_func_array($data, [ & $query]);
$data = null; //執行完畢清空條件
} elseif (is_null($data)) { //如以上都不滿足,再判斷參數是否為空
return 0; //參數為空,則返回0 :假
}
//根據條件,獲取結果集
$resultSet = $query->select($data);
$count = 0; //計數器清零,為統計返回值做準備
if ($resultSet) { //如果結果集存在
foreach ($resultSet as $data) { //遍歷該結果集
$result = $data->delete(); //逐條刪除記錄
$count += $result; //計數器自增
}
}
return $count; //返回刪除的記錄數量
}
~~~~
>[warning] 注意:這是一個靜態方法,外部調用時要注意!
****
#### 3. 參數與返回值
* 參數
|序號|參數|說明|
|:---:|---|---|
|1|$key / 主鍵| 刪除單條記錄,與delete方法類似|
|2|$array / 主鍵列表|刪除多條記錄,主鍵列表放在數組中|
|3|$where / 條件表達式| 支持所有的查詢表達式|
|3|$closure / 閉包函數| 閉包函數中僅支持使用where方法|
* 返回值:成功刪除的記錄數量。
*****
#### 4. 實例演示:
一、根據主鍵刪除記錄:
* 1. 刪除單條記錄
>[info] 主鍵直接寫在參數中,有且僅有這一個參數
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//導入自定義模型類
use app\index\model\Staff;
class Index {
public function index(){
//刪除主鍵:1020的記錄
$affected = Staff::destroy(1020);
//根據返回值判斷是否刪除成功
echo $affected ? '刪除成功!' : '刪除失敗~~';
}
}
~~~
* 2. 刪除多條記錄
>[info] 多個主鍵以數組形式提供
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//導入自定義模型類
use app\index\model\Staff;
class Index {
public function index(){
//刪除主鍵:1020的記錄
$affected = Staff::destroy([1020,1023,1030]);
//根據返回值判斷是否刪除成功
echo $affected ? '刪除成功!' : '刪除失敗~~';
}
}
~~~
>[warning] 也可以將多主鍵放在字符串中:'1020,1023,1030'。推薦使用數組方法。
* * * * *
二、 根據條件刪除
>[info] 查看該方法源碼發現,刪除條件應寫在數組中。條件表達式有很多種,我們僅舉一例說明,其它條件表達式是一樣的,請學員自己動手測試~~
**任務:**刪除主鍵id在1020到1030之間的記錄
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//導入自定義模型類
use app\index\model\Staff;
class Index {
public function index(){
//刪除主鍵id在1020到1030之間的記錄
$affected = Staff::destroy(['id'=>['between',[1028,1180]]]);
//根據返回值判斷是否刪除成功
echo $affected ? '成功刪除了'.$affected.'條記錄!' : '刪除失敗~~';
}
}
~~~
>[warning] 數組形式的條件表達式,要注意【括號】的正確嵌套!
* * * * *
三、用閉包函數設置刪除條件
>[info] 終于等到這個閉包上場了,在ThinkPHP5中,閉包幾乎無處不在。
**任務:** 刪除姓名name中有'阿'的記錄
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//導入自定義模型類
use app\index\model\Staff;
class Index {
public function index(){
//創建閉包函數
$closure = function ($query){
$query -> where(['name'=>['like','%阿%']])
};
//執行刪除操作:條件由閉包函數提供
$affected = Staff::destroy($closure);
//根據返回值判斷是否刪除成功
echo $affected ? '成功刪除了'.$affected.'條記錄!' : '刪除失敗~~';
}
}
~~~
* * * * *
#### 5. 總結
>[warning] 本章內容比較簡單,執行結果都是可預測的,就不再給出了。
**下面再總結一下條件參數:**
1. 支持主鍵或主鍵列表[數組表示]
2. 支持查詢條件表達式
3. 支持閉包函數
- 前言[隨時更新]
- 開發環境
- 1.Mac環境
- 2.windows環境
- 模型對象
- 1.創建模型對象
- 2.模型初始化
- 數據對象
- 1.定義數據對象
- 2.創建數據對象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查詢數據對象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP難點總結
- 1.get_class( )實例講解
- 2.get_called_class( )實例講解
- 3.__call( )實例講解
- 3.__callStatic( )實例講解
- 4.call_user_func_array函數[重點]
- 5.普通方法與靜態方法
- 6.在Model源碼中的應用
- 7.new static 延遲靜態綁定
- PHP標準化規范
- 查詢數據
- 1.獲取單條:get靜態方法
- 2.獲取單條:對象查詢
- 3.獲取多條:all靜態方法
- 4.獲取多條:對象查詢
- 5.獲取字段值:value方法
- 6.獲取列值:column方法
- 7.動態查詢:getBy字段名
- 8.助手函數:model查詢
- 9.加載器:Loader類查詢
- 10.數據庫與模型查詢對比
- 新增數據
- 1.sava方法
- 2.savaAll方法
- 3.create靜態方法
- 4.insert靜態調用
- 更新數據
- 1.單條更新:save方法
- 2.批量更新:saveAll方法
- 3.靜態更新:update方法
- 4.查詢類Query直接更新
- 5. 閉包更新
- 刪除數據
- 1.刪除當前記錄:delete
- 2.靜態條件刪除:destory
- 獲取器
- 1.模型方法:set屬性Attr
- 修改器
- 1.set屬性Attr
- 時間戳
- 1.MySQL中日期類型復習
- 2.時間戳功能詳解
- 軟刪除[重點]
- 1.traits詳解[選學內容]
- 2.SoftDelet類源碼分析
- 3. delete實例刪除
- 4.destroy條件刪除
- 5.restore恢復數據
- 類型轉換
- 1. 規則設置
- 2. 實例演示
- 查詢范圍
- 1. 基本概念
- 2.實例演示