ThinkPHP5.0框架開發--第8章 TP5.0 模型
第8章 TP5.0 模型
=================================================
今日學習
1、模型(model)
資料模型
2、新建資料模型
1) 手動新建
a、開啟前臺模組(C:\AppServ\www\tp5\application\index)
新建model目錄
b、在model目錄下 新建 User.php
// 宣告名稱空間
namespace app\index\model;
// 匯入系統的資料模型
use think\Model;
// 宣告user模型
class User extends Model{
}
2) 命令新建
1) 切換到專案目錄
php think make:model app\index\model\Users
3) 注意
1、資料模型的名字 建議大家跟資料庫名一致
2、如果資料庫名字和模型名不一致 可以設定表名
protected $table="";
3、如果表名(yzm_user),資料模型名 (YzmUser)
3、模型的例項化
1、呼叫靜態方法
$res=User::get(1);
dump($res->toArray());
2、例項化資料模型
$user=new User();
$res=$user::get(2);
dump($res->toArray());
3、使用loader
$user=Loader::model("user");
$res=$user::get(3);
dump($res->toArray());
4、使用助手函式
$user=model("user");
$res=$user::get(4);
dump($res->toArray());
4、查詢操作
1、單條資料
// get方法
// 使用數字
$res=User::get(1); // 預設主鍵
// 使用陣列
$res=User::get(["name"=>'yzmedu3']); // 預設查詢使用者名稱
// 使用閉包函式
$res=User::get(function($query){
$query->where("id",15);
});
// find方法
$res=User::where("id",13)->find();
2、查詢多條資料
// all
// 所有資料
$res=User::all();
// 字串
$res=User::all("1,2,3");
// 陣列
$res=User::all([5,6,7]);
// 陣列
$res=User::all(['pass'=>'123']);
// 閉包
$res=User::all(function($query){
$query->where("pass","123")
->whereOr("pass","456")
->order("id","desc");
});
// select 和 all 基本類似
$res=User::select();
$res=User::limit(2)->select();
3、獲取某個欄位和某列值
// 獲取某個值
$res=User::where("id",5)->value("name");
// 獲取某列值
$res=User::column("name","id");
4、動態查詢
// 查詢出匹配到的第一條資料
// getBy欄位名
$res=User::getByAge('44');
dump($res->toArray());
5、增加操作
1、設定屬性
$user=new User();
$user->name="yzmedu21";
$user->pass="abc";
$user->age=18;
// 返回影響行數
$user->save();
2、通過data方法
$user=new User();
$user->data([
"name"=>"yzmedu22",
"age"=>"22",
"pass"=>"qwe",
]);
// 返回影響行數
$user->save();
3、例項化時
$user=new User([
"name"=>"yzmedu23",
"pass"=>'zxc',
"age"=>20
]);
// 返回影響行數
$user->save();
// allowField 遮蔽掉資料庫中不存在的欄位
$user->allowField(true)->save();
// 指定插入資料庫的欄位
$user->allowField(['name','age'])->save();
4、獲取自增的ID
// 獲取插入資料ID
echo $user->id;
5、增加多條資料
$user=new User();
$list=[
['name'=>"yzmedu33","age"=>33],
['name'=>"yzmedu34","age"=>34]
];
$user->saveAll($list);
6、create方法
$user=User::create([
"name"=>"yzmedu35",
"age"=>35
]);
6、刪除操作
// $user=User::get(1);
// 返回影響行數
// dump($user->delete());
// 刪除主鍵2
$user=User::destroy(2);
// 刪除主鍵3,4,5
$user=User::destroy("3,4,5");
$user=User::destroy([6,7,8]);
// 刪除name
$user=User::destroy(['name'=>"yzmedu23"]);
// 刪除多個條件
$user=User::destroy(['name'=>'yzmedu33','age'=>33]);
// 使用閉包
$user=User::destroy(function($query){
$query->where("id","<","15");
});
// 刪除資料
$user=User::where("id",">","19")->delete();
dump($user);
7、修改操作
// 設定欄位更新資料
$user=User::get(15);
$user->age=19;
$res=$user->save();
// 直接陣列修改
$user=new User;
$res=$user->save(
[
"pass"=>"qweasd",
"age"=>16,
],["id"=>16]);
// 修改資料
$_POST['name']="yzmedu55";
$_POST['pass']="pass55";
$_POST['age']="55";
$_POST['sex']="nan";
$_POST['id']=17;
$user=new User;
$res=$user->allowField(['name','pass','age'])->save($_POST,['id'=>17]);
// 批量更新
$data=[
['id'=>15,'name'=>"abc",'pass'=>456],
['id'=>17,'name'=>"abc",'pass'=>456],
];
$user=new User;
$res=$user->saveAll($data);
echo User::getLastSql();
// 更新操作
$user=new User;
$res=$user->where("id",'>','17')->update(['age'=>18]);
$res=User::where("id","<","18")->update(['pass'=>'zxc']);
// 閉包更新資料
$user=new User;
$res=$user->save(['name'=>'yunzhimeng'],function($query){
$query->where("id","15");
});
8、聚合
// 統計資料條數
$tot=User::count();
dump($tot);
// 條件判斷
$tot=User::where("age",">",18)->count();
dump($tot);
// 統計最大值
$max=User::max('age');
dump($max);
// 統計最小值
$min=User::min("age");
dump($min);
// 平均值
$avg=User::avg('age');
dump($avg);
// 求和
$sum=User::sum('age');
dump($sum);
9、獲取器
1、資料模型
// sex 的獲取器
public function getSexAttr($val){
switch ($val) {
case '0':
return "未知";
break;
case "1":
return "男";
break;
case "2":
return "女";
break;
}
}
2、控制器
// 獲取ID為15 的資料
$user=User::get(17);
// 經過獲取器的操作
dump($user->toArray());
dump($user->sex);
// 不經過獲取器處理
dump($user->getData());
3、注意
1、如果欄位 user_status 修改器名字getUserStatusAttr
2、如果欄位 status 修改器名字getStatusAttr
10、修改器
1、資料模型
// 使用者密碼的修改器
public function setPassAttr($val){
return md5($val);
}
2、控制器
// 修改 ID 為15 的密碼
$user=new User();
// 密碼會實現自動加密
$res=$user->save(['pass'=>'456'],['id'=>15]);
dump($res);
3、注意
1、修改器的觸發條件是 save方法
11、自動完成
1、修改器和自動完成區別
修改器:資料賦值的時候自動進行轉換處理
自動完成:沒有手動賦值的情況下進行手動處理
2、自動完成
// 增加和修改操作都會執行
protected $auto=[];
// 建立資料執行
protected $insert=['create_time'];
// 修改資料執行
protected $update=['update_time'];
12、時間戳
1、系統支援自動寫入建立和更新的時間戳欄位
1) 在配置檔案中設定
// 自動寫入時間戳欄位
'auto_timestamp' => true,
2) 在資料模型中設定
// 設定自動寫入時間戳
protected $autoWriteTimestamp=true;
2、可以設定欄位預設值
// 增加時間的欄位
protected $createTime='create_times';
// 更新時間的欄位
protected $updateTime='update_times';
3、取消更新時間戳設定
protected $updateTime=false;
14、軟刪除
1、作用:
實現假刪除,可以進行恢復
2、實現
<?php
// 宣告名稱空間
namespace app\index\model;
// 匯入系統的資料模型
use think\Model;
// 配合軟刪除
use traits\model\SoftDelete;
// 宣告user模型
class User extends Model{
// 使用軟刪除
use SoftDelete;
// 設定刪除的時間戳
protected $deleteTime="delete_times";
}
3、控制器
1、刪除資料
$res=User::destroy(15);
2、獲取資料
$res=User::get(15);
// 軟刪除 資料庫資料存在,但是get獲取不到
3、直接刪除資料
$res=User::destroy(14,true);
$user=new User();
$res=$user->where("id",'5')->delete();
4、讀取所有資料包含軟刪除資料
$res=User::withTrashed()->find(15);
$res=User::withTrashed()->select();
5、僅僅讀取軟刪除資料
$res=User::onlyTrashed()->select();
$res=User::onlyTrashed()->find(1);