## 常用的鏈式方法
* field()用來選擇需要獲取的字段
> 用法:
> 第一種:filed('id,name')
> 第二種:field(['id'=>'編號','name'=>'姓名']),這種方式可以給字段起別名
* where()用來選擇條件
>~~~
> 用法:
> 第一種:where('id','=',1),如果是相等關系可以省略=,我個人覺得沒必要省略,保持統一
> 第二種:where([['id','=',1],['grade','>=',80]])
> 第三種:where('info->email','thinkphp@qq.com'),查詢JSON類型字段(info字段為json類型)
> 第四種:where('type=1 AND status=1'),使用字符串,與第一種的區別在于不會對查詢字段進行避免關鍵字沖突處理,建議配合預處理機制where("id=:id and username=:name", ['id' => [1, \PDO::PARAM_INT] , 'name' => 'thinkphp'])或者使用:
> Db::table('think_user')
> ->where("id=:id and username=:name")
> ->bind(['id' => [1, \PDO::PARAM_INT] , 'name' => 'thinkphp'])
> ->select();
> 也可以使用更加安全的方式:
>Db::table('think_user')
>whereRaw("id=:id and username=:name", ['id' => [1, \PDO::PARAM_INT] , 'name' => 'thinkphp'])
>select();
> ~~~
* find()用來查詢數據
> 沒有查詢到數據返回null,查詢到數據返回數據庫中的第一條記錄,以數組的形式返回
> 用法:
> 第一種:find()
> 第二種:find(1),這種方式可以用來在主鍵查詢,省略where()主鍵條件
* findOrFail()
> 此方法沒有找到數據會拋出異常
* findOrEmpty()
> 當查詢不存在的時候返回空數組而不是Null
* select()用來查詢多條數據
> 沒有查詢到數據返回一個空數組,查詢到數據返回一個非空數組
> 用法:
> select()
* value()用來獲取單個字段的值
> 沒有查詢到數據返回null,如果查詢到的話返回一個字符串
> 用法:
> Db::table('test')->where('id','=',1)->value('name')
* column()用來獲取某一列的值
> 用法:
> 第一種:column('name'),column('name','id')
> 第二種:column('*','id'),返回完整數據,并且添加一個索引值,指定id字段的值作為索引
* selectOrFail()
> 此方法沒有找到數據會拋出異常
* insert()
> 新增單條,新增成功返回新增的條數,失敗返回false
> 用法:
> 第一種:insert($data),$data為一個數組
> 第二種:insert($data,true),第二種用法使用replace into插入,并且這種方式只能使用在mysql數據庫上
> insert into 和 replace into的差別:
> replace into 首先嘗試插入數據到表中
> 1.如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據。
> 2.否則,直接插入新數據。
> 要注意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入數據,這將導致表中出現重復的數據。
* data()
> 這種用法的好處是可以進行一些基本的過濾,不過需要注意的是用了data()方法之后,insert()方法中就不能支持true
> 用法:
> data($data),$data是一個數組
* insertGetId()
> 插入的同時返回新增的id
> 一共執行了兩步:第一步是插入,第二步是返回主鍵id
> insertGetId($data),$data是數組
* insertGetId()
> 插入的同時返回新增的id
> 一共執行了兩步:第一步是插入,第二步是返回主鍵id
> insertGetId($data),$data是數組
* insertAll()
> 新增多條,新增成功返回新增的條數,失敗返回false
> insertAll(),insertAll($data,true)
* update()
> 必須要更新條件,如果更新條件是主鍵的話,可以直接把主鍵寫到更新數組中
> 同時注意,更新操作前面不能使用data()方法,更新成功返回更新的條數,沒修改任何數據返回0
> 用法:
> Db::table('test')->where('id','=',1)->update($data)
> Db::table('test')->update(['id'=>2,'name'=>'就是這么強']),tp5.1會自動把id作為更新的條件
* delete()
> 刪除成功返回刪除數量,否則返回0
> 用法:
> delete(1),delete([1,2,3]),如果是根據主鍵刪除的話可以在delete()方法中直接傳入一個主鍵id,就可以成功刪除了
> delete(true),不帶條件調用delete()方法會提示錯誤,通過true可以無條件刪除所有的數據
* query()
> 用來執行原生sql語句
> 用法:
> delete($sql),$sql為原生的sql語句
* table()
> 用來指定數據庫表
> 用法:
> 第一種:可以指定數據庫table("數據庫名.完整的數據表名")
> 第二種:可以指定多張表table("表名 別名,表名 別名")
> 第三種:使用數組可以盡量避免與mysql的關鍵字沖突,table(['think_user'=>'user','think_role'=>'role'])
* name()
> 數據表設置了表前綴的話,可以使用name(表名)來指定表名,此時的表名不需要加上表前綴,如果沒有指定表前綴的話,name()方法和table()方法是一樣的使用方法
* chunk()
> 該方法用來處理成千上百條數據庫記錄,該方法一次獲取結果集的一小塊,然后填充到每一小塊數據要處理的閉包,該方法在編寫處理大量數據庫記錄的時候非常有用。
> 比如,我們可以全部用戶表數據進行分批處理,每次處理 100 個用戶記錄:
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> foreach ($users as $user) {
> //
> }
> });
> // 或者交給回調方法myUserIterator處理
> Db::table('think_user')->chunk(100, 'myUserIterator');
>
> ~~~
> 你可以通過從閉包函數中返回`false`來中止對后續數據集的處理:
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> foreach ($users as $user) {
> // 處理結果集...
> if($user->status==0){
> return false;
> }
> }
> });
>
> ~~~
>
> 也支持在`chunk`方法之前調用其它的查詢方法,例如:
>
> ~~~
> Db::table('think_user')
> ->where('score','>',80)
> ->chunk(100, function($users) {
> foreach ($users as $user) {
> //
> }
> });
>
> ~~~
>
> `chunk`方法的處理默認是根據主鍵查詢,支持指定字段,例如:
>
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> // 處理結果集...
> return false;
> },'create_time');
>
> ~~~
>
> 并且支持指定處理數據的順序。
>
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> // 處理結果集...
> return false;
> },'create_time', 'desc');
> ~~~
* cursor()
>~~~
> 如果需要處理大量的數據,可以使用新版提供的游標查詢功能,該查詢方式利用了PHP的生成器特性,可以減少大量數據查詢的內存占用問題
>
> $cursor = Db::table('user')->where('status', 1)->cursor();
> foreach($cursor as $user){
> echo $user['name'];
> }
> `cursor`方法返回的是一個生成器對象,`user`變量是數據表的一條數據(數組)。
> ~~~
* strict(false)
> 通過這個方法在insert()添加數據的時候,可以過濾掉那些并不是數據庫中相關字段的數據,也就是數據庫中沒有name這個字段,但是你添加數據的時候,添上了name這個字段的值,我就可以通過這個方法過濾掉這個字段
* limit()
> 在使用insert()插入數據的時候,可以使用limit()方法指定每次插入的數量限制,實現分批寫入
* raw()
> ~~~
> 適合在數組更新的時候,raw()方法可以執行表達式或者是sql函數
> Db::name('user')
> ->where('id', 1)
> ->update([
> 'name' => Db::raw('UPPER(name)'),
> 'score' => Db::raw('score-3'),
> 'read_time' => Db::raw('read_time+1')
> ]);
> ~~~
* setField()
>~~~
>用于更新某個字段值
> Db::name('user')
> ->where('id',1)
> ->setField('name', 'thinkphp');
> ~~~
* setInc()/setDec()
~~~
// score 字段加 1
Db::table('think_user')
->where('id', 1)
->setInc('score');
// score 字段加 5
Db::table('think_user')
->where('id', 1)
->setInc('score', 5);
// score 字段減 1
Db::table('think_user')
->where('id', 1)
->setDec('score');
// score 字段減 5
Db::table('think_user')
->where('id', 1)
->setDec('score', 5);
最終生成的SQL語句可能是:
UPDATE `think_user` SET `score` = `score` + 1 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` + 5 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` - 1 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` - 5 WHERE `id` = 1
setInc/setDec支持延時更新,如果需要延時更新則傳入第三個參數,下例中延時10秒更新。
Db::name('user')->where('id', 1)->setInc('score', 1, 10);
setInc/setDec 方法返回影響數據的條數,如果使用了延遲更新的話,可能會返回true
~~~
* useSoftDelete()軟刪除
~~~
// 軟刪除數據 使用delete_time字段標記刪除
Db::name('user')
->where('id', 1)
->useSoftDelete('delete_time',time())
->delete();
實際生成的SQL語句可能如下(執行的是`UPDATE`操作):
UPDATE `think_user` SET `delete_time` = '1515745214' WHERE `id` =
`useSoftDelete`方法表示使用軟刪除,并且指定軟刪除字段為`delete_time`,寫入數據為當前的時間戳。
~~~
* alias()
> 用來設置當前數據表的別名
> 用法:
> 第一種:Db::table('think_user')->alias('a')
> 第二種:Db::table('think_user')->alias(['think_dept'=>'dept','think_user'=>'user'])->join('think_dept','dept.user_id=user.id)