模型定義
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $pk = 'uid';//默認(rèn)主鍵是id顽照,如果不是需要綁定
protected $table = 'cms_user';//綁定數(shù)據(jù)表
// 設(shè)置當(dāng)前模型的數(shù)據(jù)庫連接(當(dāng)你的數(shù)據(jù)庫鏈接不是配置中鏈接時設(shè)置斟珊。)
protected $connection = [
// 數(shù)據(jù)庫類型
'type' => 'mysql',
// 服務(wù)器地址
'hostname' => '127.0.0.1',
// 數(shù)據(jù)庫名
'database' => 'thinkphp',
// 數(shù)據(jù)庫用戶名
'username' => 'root',
// 數(shù)據(jù)庫密碼
'password' => '',
// 數(shù)據(jù)庫編碼默認(rèn)采用utf8
'charset' => 'utf8',
// 數(shù)據(jù)庫表前綴
'prefix' => 'think_',
// 數(shù)據(jù)庫調(diào)試模式
'debug' => false,
];
}
模型調(diào)用
模型類可以使用靜態(tài)調(diào)用或者實例化調(diào)用兩種方式
- 在模型中調(diào)用
// 靜態(tài)調(diào)用
$user = User::get(1);//$user = $this->get(3);一樣的效果膛檀,都是調(diào)用本類的方法
$user->name = 'thinkphp';
$user->save();
// 實例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();
// 使用 Loader 類實例化(單例)==>需要引入locader類,`use think\Loader;`
$user = Loader::model('User');
// 或者使用助手函數(shù)`model`也是單例
$user = model('User');
$user->name= 'thinkphp';
$user->id = 3;
$user->save();
- 在控制器調(diào)用模型
//引入此model類
use app\index\model\User;//==》如果模型名和控制名一樣的話需要設(shè)置別名吗垮。use app\index\model\User as UserModel;
//在方法中實例化
$user = new User;
//調(diào)用實例方法
$user->user_name= 'thinkphp';
return $user->save();
//當(dāng)然也可以使用loader函數(shù),只需在頭部引入即可`use think\Loader;`
添加數(shù)據(jù)
- 實例化模型對象后賦值并保存:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
此種方式有個缺陷,就是字段值不能和Model里面的成員屬性(比如class羡宙,具體看think\Model.php)一樣,否則會賦值不上掐隐,版本5.0.10狗热,已提出問題,不知道后期會不會優(yōu)化瑟枫。
- data
$user = new User;
$user->data([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
- 直接在實例化的時候傳入數(shù)據(jù)
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
- 過濾非數(shù)據(jù)表字段的數(shù)據(jù)
$user = new User($_POST);
// 過濾post數(shù)組中的非數(shù)據(jù)表字段數(shù)據(jù)
$user->allowField(true)->save();
- 指定某些字段寫入
$user = new User($_POST);
// post數(shù)組中只有name和email字段會寫入
$user->allowField(['name','email'])->save();
- 靜態(tài)方法
還可以直接靜態(tài)調(diào)用create方法創(chuàng)建并寫入:
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 獲取自增ID
獲取自增ID
- 出入數(shù)據(jù)獲取自增id
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
// 獲取自增ID
echo $user->id;//這里的id是主鍵斗搞,如果主鍵是user_id,那就是$user->user_id
注意不要在同一個實例里面多次新增數(shù)據(jù)慷妙,如果確實需要多次新增僻焚,因為當(dāng)新增數(shù)據(jù)時,$user里面的字段值都是此條的數(shù)據(jù)膝擂,當(dāng)你再次添加時虑啤,會造成當(dāng)前數(shù)據(jù)部分值被替換,而且還存在主鍵架馋。狞山。。所以那不是新增數(shù)據(jù)叉寂,當(dāng)然系統(tǒng)也會報錯萍启,那么可以用下面的方式:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
$user->name = 'onethink';
$user->email = 'onethink@qq.com';
// 第二次開始必須使用下面的方式新增
$user->isUpdate(false)->save();
- 添加多條數(shù)據(jù)
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
saveAll方法新增數(shù)據(jù)返回的是包含新增模型(帶自增ID)的數(shù)據(jù)集(數(shù)組)。
修改數(shù)據(jù)
修改數(shù)據(jù)和新增數(shù)據(jù)差不多一個道理,系統(tǒng)會根據(jù)數(shù)據(jù)或者條件自動識別是新增還是修改
- 實例化模型后調(diào)用save方法表示新增勘纯;//存在主鍵會報錯局服,當(dāng)批量時可以設(shè)置saveAll的第二個參數(shù)為false
- 查詢數(shù)據(jù)后調(diào)用save方法表示更新驳遵;//因為查詢后此實例帶有主鍵值
- save方法傳入更新條件后表示更新淫奔;
批量更新僅能根據(jù)主鍵值進行更新,其它情況請使用foreach遍歷更新堤结。
刪除當(dāng)前模型
- delete
delete
方法需要查詢再刪除唆迁,如果不查詢想通過主鍵刪除的話需要添加where條件,否則會報‘添加條件’錯誤
$user = User::get(1);
$user->delete();
//或者
$user->where('id',1)->delete();
- destroy
destroy
不能使用其他連貫操作竞穷,如果使用的話會報method not exist:think\db\Query->destroy
錯誤唐责,具體請看destroy和delete函數(shù)的區(qū)別。但是可以在傳遞參數(shù)時設(shè)置條件来庭,同時也支持閉包
User::destroy(1);
// 支持批量刪除多個數(shù)據(jù)
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
//條件:id>:id
User::destroy(['id'=>['>',$id]]);
//閉包
User::destroy(function($query) use($id){
$query->where('id','>',$id);
});
V5.0.9+版本開始當(dāng)destroy方法傳入空值(包括空字符串和空數(shù)組)的時候不會做任何的數(shù)據(jù)刪除操作妒蔚,但傳入0則是有效的
查詢
- 獲取單個數(shù)據(jù) get
取出主鍵為1的數(shù)據(jù)
$user = User::get(1);
echo $user->name;
// 使用數(shù)組查詢
$user = User::get(['name' => 'thinkphp']);
// 使用閉包查詢
$user = User::get(function($query){
$query->where('name', 'thinkphp');
});
echo $user->name;
/在模型中,User::可以$this->;如User::get(1)和$this->get(1)一樣
get方法也是不能使用連貫操作的,而且需要傳遞參數(shù)
如果你是在模型內(nèi)部月弛,請不要使用$this->name的方式來獲取數(shù)據(jù)肴盏,請使用$this->getAttr('name') 替代。因為可能會和model類的成員屬性重復(fù)帽衙。
- 查詢單個 find
$user = new User();
// 查詢單個數(shù)據(jù)
$user->where('name', 'thinkphp')
->find();
- 獲取多個數(shù)據(jù) all
// 根據(jù)主鍵獲取多個數(shù)據(jù)
$list = User::all('1,2,3');
// 或者使用數(shù)組
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
echo $user->name;
}
// 使用數(shù)組查詢
$list = User::all(['status'=>1]);
// 使用閉包查詢
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user->name;
}
數(shù)組方式和閉包方式的數(shù)據(jù)查詢的區(qū)別在于菜皂,數(shù)組方式只能定義查詢條件,閉包方式可以支持更多的連貫操作厉萝,包括排序恍飘、數(shù)量限制等。
- 獲取多個數(shù)據(jù) select
$user = new User();
// 查詢數(shù)據(jù)集
$user->where('name', 'thinkphp')
->limit(10)
->order('id', 'desc')
->select();
雖然說返回的結(jié)果集是一個數(shù)組對象谴垫,但是不影響遍歷(也不影響在模板中遍歷)章母,直接像處理3.2一樣處理
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user['id'].':'.$user->name.'<br />';
}
- 獲取某個字段或者某個列的值
// 獲取某個用戶的積分(返回值:字符串)
User::where('id',10)->value('score');
// 獲取某個列的所有值(返回值:數(shù)組)
User::where('status',1)->column('name');
// 以id為索引)(返回值:數(shù)組)
User::where('status',1)->column('name','id');
User::where('status',1)->column('id,name'); // 同tp3的getField
動態(tài)查詢
// 根據(jù)name字段查詢用戶
$user = User::getByUserName('new1');//
// 根據(jù)email字段查詢用戶
$user = User::getByEmail('thinkphp@qq.com');
默認(rèn)按照數(shù)據(jù)表從上到下的順序查詢第一條復(fù)合的數(shù)據(jù),如果需要排序則添加連貫操作
數(shù)據(jù)分批處理
處理大量數(shù)據(jù)的時候使用
User::chunk(100,function($users){
foreach($users as $user){
// 處理user模型對象
}
});
查詢緩存
get方法和all方法的第三個參數(shù)表示是否使用查詢緩存翩剪,或者設(shè)置緩存標(biāo)識乳怎。
$user = User::get(1,'',true);
$list = User::all('1,2,3','',true);
由于第二個參數(shù)是關(guān)聯(lián)預(yù)載入定義,V5.0.6+版本開始前弯,可以直接在第二個參數(shù)傳入true表示開啟查詢緩存蚪缀。