1. 程式人生 > >第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;

13、軟刪除

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);