thinkPHP對(duì)數(shù)據(jù)庫的CURD操作總共有三種:原生、查詢構(gòu)造器、模型
1、原生
查詢 query(select)
更新和寫入 execute(update/insert) 如果數(shù)據(jù)非法或者查詢錯(cuò)誤則返回false,否則返回影響的記錄數(shù)。
$res = Db::query('select * from staff'); $sql = "update staff set `email`='tmz@php.cn' WHERE `id` = 11"; $res = Db::execute($sql); dump($res);
2、查詢構(gòu)造器
首先需要在thinkPHP的 config/database.php 配置文件中配置下數(shù)據(jù)庫的連接數(shù)據(jù)。
然后通過查詢構(gòu)造器進(jìn)行操作:
2.1 查詢
Db::table('staff') ->where('id',1) ->find() | ->select() | ->value('name') | ->column('name','id')
find 方法只能查詢滿足條件的第一條數(shù)據(jù),查詢結(jié)果不存在,返回 null,否則返回結(jié)果數(shù)組
select 方法查詢滿足條件所有數(shù)據(jù),結(jié)果是一個(gè)二維數(shù)組,如果結(jié)果不存在,返回空數(shù)組
value 查詢某個(gè)字段的值 方法查詢結(jié)果不存在,返回 null
column 查詢某一列的值 方法查詢結(jié)果不存在,返回空數(shù)組
2.2 新增
* 添加單條記錄
$data = ['foo' => 'bar', 'bar' => 'foo']; Db::table('staff') ->insert($data) | ->data($data)->insert() | ->strict(false)->insert($data) | ->insert($data, true) ->insertGetId($data)
insert 方法添加數(shù)據(jù)成功返回添加成功的條數(shù),通常情況返回 1
data 方法傳入要添加的數(shù)據(jù) 數(shù)據(jù)表里面沒有foo或者bar字段,那么就會(huì)拋出異常
strict 不存在的字段的值將會(huì)直接拋棄
insertGetId 方法添加數(shù)據(jù)成功返回添加數(shù)據(jù)的自增主鍵
* 添加多條數(shù)據(jù)
$data = [ ['foo' => 'bar', 'bar' => 'foo'], ['foo' => 'bar1', 'bar' => 'foo1'], ['foo' => 'bar2', 'bar' => 'foo2']]; Db::table('staff') ->insertAll($data) | ->data($data)->insertAll()
insertAll 方法添加數(shù)據(jù)成功返回添加成功的條數(shù)
data 方法傳入要添加的數(shù)據(jù)
* 確保要批量添加的數(shù)據(jù)字段是一致的
2.3 更新
Db::table('staff') ->where('id', 1) // 數(shù)據(jù) ->update(['name' => 'thinkphp']) | ->data(['name' => 'thinkphp'])->update()
update 方法返回影響數(shù)據(jù)的條數(shù),沒修改任何數(shù)據(jù)返回 0
data 方法傳入要更新的數(shù)據(jù)
* 如果update方法和data方法同時(shí)傳入更新數(shù)據(jù),則會(huì)進(jìn)行合并。
* 如果數(shù)據(jù)中包含主鍵,可以直接使用:
Db::table('staff') ->update(['name' => 'thinkphp','id'=>1]); 實(shí)際生成的代碼:UPDATE `think_user` SET `name`='thinkphp' WHERE `id` = 1
* 更新字段值
Db::table('staff') ->where('id',1) ->setField('name', 'thinkphp')
setField 方法返回影響數(shù)據(jù)的條數(shù),沒修改任何數(shù)據(jù)字段返回 0
* 自增或自減一個(gè)字段的值
Db::table('staff') ->where('id', 1) ->setInc('score') | ->setInc('score', 5)
setInc/setDec 方法自增或自減一個(gè)字段的值( 如不加第二個(gè)參數(shù),默認(rèn)步長為1)
setInc/setDec 支持延時(shí)更新,如果需要延時(shí)更新則傳入第三個(gè)參數(shù),下例中延時(shí)10秒更新
Db::table('staff') ->where('id', 1) ->setInc('score', 1, 10)
setInc/setDec 方法返回影響數(shù)據(jù)的條數(shù),如果使用了延遲更新的話,可能會(huì)返回true
2.4 刪除
Db::table('staff')->delete(1) | ->delete([1,2,3]) Db::table('staff')->where('id',1)->delete() Db::table('staff')->delete(true)
delete 方法返回影響數(shù)據(jù)的條數(shù),沒有刪除返回 0
2.5 軟刪除
一般情況下,業(yè)務(wù)數(shù)據(jù)不建議真實(shí)刪除數(shù)據(jù),系統(tǒng)提供了軟刪除機(jī)制(模型中使用軟刪除更為方便) // 軟刪除數(shù)據(jù) 使用delete_time字段標(biāo)記刪除 Db::table('staff') ->where('id',1) ->useSoftDelete('delete_time',time()) ->delete();
useSoftDelete 方法表示使用軟刪除,并且指定軟刪除字段為delete_time,寫入數(shù)據(jù)為當(dāng)前的時(shí)間戳。
2.6 鏈?zhǔn)秸{(diào)用
Db::table('staff') ->field() ->where() ->limit() table('表名') 用于指定操作的數(shù)據(jù)表 field('字段1,字段2,...') 字符串 標(biāo)識(shí)要返回或者操作的字段,可以用于查詢和寫入操作 field(['字段1','字段2','字段N',...]) 數(shù)組 field(['字段1','字段2'=>'別名']) 數(shù)組方式可以為某些字段定義別名 field(true) 顯示獲取數(shù)據(jù)表的所有字段列表 where('字段名','表達(dá)式','查詢條件') 表達(dá)式查詢 where(['name' =>'thinkphp','status'=> 1]) 數(shù)組條件查詢:關(guān)聯(lián)數(shù)組和索引數(shù)組 where('type=1 AND status=1') 字符串條件查詢 limit(number) 限制結(jié)果數(shù)量 limit(起始數(shù)據(jù),顯示條數(shù)) 分頁查詢 order('id', 'desc') 對(duì)操作的結(jié)果排序或者優(yōu)先級(jí)限制 ORDER BY `id` desc order(['order','id'=>'desc']) 對(duì)多個(gè)字段的排序 ORDER BY `order`,`id` desc * 如果沒有指定desc或者asc排序規(guī)則的話,默認(rèn)為asc strict(false) 設(shè)置是否嚴(yán)格檢查字段名 alias('別名') 設(shè)置當(dāng)前數(shù)據(jù)表的別名
3、模型查詢
模型查詢和數(shù)據(jù)庫查詢方法的區(qū)別主要在于,模型中的查詢的數(shù)據(jù)在獲取的時(shí)候會(huì)經(jīng)過獲取器的處理,以及更加對(duì)象化的獲取方式。
模型查詢一般一個(gè)模型是對(duì)應(yīng)著一張表,創(chuàng)建模型并且繼承系統(tǒng)的Model模型類庫。
模型會(huì)自動(dòng)對(duì)應(yīng)數(shù)據(jù)表,模型類的命名規(guī)則是除去表前綴的數(shù)據(jù)表名稱,采用駝峰法命名,并且首字母大寫
模型常用的設(shè)置屬性:
namespace app\index\model; use think\Model; class User extends Model{ // 設(shè)置當(dāng)前模型對(duì)應(yīng)的完整數(shù)據(jù)表名稱 protected $table = 'staff'; // 設(shè)置當(dāng)前模型的數(shù)據(jù)庫連接 protected $connection = 'db_config'; // 默認(rèn)主鍵為id,如果你沒有使用id作為主鍵名,需要在模型中設(shè)置屬性 protected $pk = 'uid'; }
3.1 查詢
// 主鍵查詢 $res = User::get(1); // 查詢構(gòu)造器 $res = User::field('id,name,email') ->where('id',5) ->find(); // 閉包 必傳參數(shù) Query $query $res = User::get(function (Query $query){ $query->where('id',7); });
* 根據(jù)主鍵查詢單條數(shù)據(jù)
$user = User::get(1); echo $user->name; $user = User::where('name', 'thinkphp')->find(); echo $user->name;
get(主鍵值) 查詢滿足當(dāng)前主鍵的數(shù)據(jù)
模型無論使用get還是find方法查詢,返回的是都當(dāng)前模型的對(duì)象實(shí)例,如果查詢數(shù)據(jù)不存在,則返回Null,除了獲取模型數(shù)據(jù)外,還可以使用模型的方法。
* 根據(jù)主鍵獲取多個(gè)數(shù)據(jù)
$list = User::all('1,2,3') | all([1,2,3]) foreach($list as $key=>$user){ echo $user->name; }
all() 沒參數(shù)則是獲取所有數(shù)據(jù)
all('1,2,3')或all([1,2,3]) 獲取主鍵值為 1,2,3 的數(shù)據(jù)
*****
User:: 相當(dāng)于 Db::table(),所以可以使用User::代替Db::table()進(jìn)行操作--使用查詢構(gòu)造器查詢,但是第一個(gè)方法一定是靜態(tài)調(diào)用
User::where('status', 1)->limit(3)->order('id', 'asc')->all()
3.2 新增
* 新增單條數(shù)據(jù)
實(shí)例化模型對(duì)象后賦值并保存 $user= new User; $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->save(); 或 直接傳入數(shù)據(jù)到save方法批量賦值 $user->save([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com']) 或 直接在實(shí)例化的時(shí)候傳入數(shù)據(jù) $user = new User([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com']); $user->save();
獲取自增ID echo $user->id;
save 方法返回影響的記錄數(shù),并且只有當(dāng)before_insert事件返回false的時(shí)候返回false,從V5.1.6+版本開始統(tǒng)一返回布爾值
* 添加多條數(shù)據(jù)
$list = [ ['name'=>'thinkphp','email'=>'thinkphp@qq.com'], ['name'=>'onethink','email'=>'onethink@qq.com']]; $user->saveAll($list);
saveAll 方法新增數(shù)據(jù)返回的是包含新增模型(帶自增ID)的數(shù)據(jù)集對(duì)象。默認(rèn)會(huì)自動(dòng)識(shí)別數(shù)據(jù)是需要新增還是更新操作,當(dāng)數(shù)據(jù)中存在主鍵的時(shí)候會(huì)認(rèn)為是更新操作,如果你需要帶主鍵數(shù)據(jù)批量新增,可以使用下面的方式:
$list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],]; $user->saveAll($list, false);
** 靜態(tài)方法
$user = User::create([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com']); echo $user->name; echo $user->email; echo $user->id; // 獲取自增ID
和save方法不同的是,create方法返回的是當(dāng)前模型的對(duì)象實(shí)例
3.3 查找和更新
在取出數(shù)據(jù)后,更改字段內(nèi)容后使用save方法更新數(shù)據(jù)。這種方式是最佳的更新方式。 $user = User::get(1); $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->save();
* 查詢構(gòu)造器
$user = User::where('status',1) ->where('name','liuchen') ->find();
* 批量更新數(shù)據(jù)
** saveAll 方法批量更新數(shù)據(jù),只需要在批量更新的數(shù)據(jù)中包含主鍵即可
$list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']]; $user->saveAll($list); 批量更新方法返回的是一個(gè)數(shù)據(jù)集對(duì)象。批量更新僅能根據(jù)主鍵值進(jìn)行更新,其它情況請(qǐng)自行處理。
** 靜態(tài)方法
User::where('id', 1) ->update(['name' => 'thinkphp']); 或 User::update(['id' => 1, 'name' => 'thinkphp']);
3.4 刪除
* 刪除模型數(shù)據(jù)
$user = User::get(1); $user->delete(); delete方法返回影響的記錄數(shù)
* 靜態(tài)方法(根據(jù)主鍵刪除)
User::destroy(1); User::destroy('1,2,3') | destroy([1,2,3]);
destroy 方法傳入空值(包括空字符串和空數(shù)組)的時(shí)候不會(huì)做任何的數(shù)據(jù)刪除操作,但傳入0則是有效的
* 閉包刪除
User::destroy(function($query){ $query->where('id','>',10); });
* 如果刪除當(dāng)前模型數(shù)據(jù),用delete方法,如果需要直接刪除數(shù)據(jù),使用destroy靜態(tài)方法
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)