ThinkPHP 數據庫操作(三) : 查詢方法、查詢語法、鏈式操作

ThinkPHP 數據庫操作(三) : 查詢方法、查詢語法、鏈式操作

查詢方法

條件查詢方法

where 方法

可以使用 where 方法進行 AND 條件查詢:

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->where('status',1)
    ->find();

多字段相同條件的 AND 查詢可以簡化爲如下方式:

Db::table('think_user')
    ->where('name&title','like','%thinkphp')
    ->find();

whereOr 方法

使用 whereOr 方法進行 OR 查詢:

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->whereOr('title','like','%thinkphp')
    ->find();

多字段相同條件的 OR 查詢可以簡化爲如下方式:

Db::table('think_user')
    ->where('name|title','like','%thinkphp')
    ->find();

混合查詢

where方法和whereOr方法在複雜的查詢條件中經常需要配合一起混合使用,下面舉個例子:

$result = Db::table('think_user')->where(function ($query) {
    $query->where('id', 1)->whereor('id', 2);
})->whereOr(function ($query) {
    $query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp');
})->select();

生成的sql語句類似於下面:

SELECT * FROM `think_user` WHERE ( `id` = 1 OR `id` = 2 ) OR ( `name` LIKE 'think' OR `name` LIKE 'thinkphp' )

  注意閉包查詢裏面的順序,而且第一個查詢方法用where或者whereOr是沒有區別的。

getTableInfo 方法

使用getTableInfo可以獲取表信息,信息類型 包括 fields,type,bind,pk,以數組的形式展示,可以指定某個信 息進行獲取

// 獲取`think_user`表所有信息
Db::getTableInfo('think_user');
// 獲取`think_user`表所有字段
Db::getTableInfo('think_user', 'fields');
// 獲取`think_user`表所有字段的類型
Db::getTableInfo('think_user', 'type');
// 獲取`think_user`表的主鍵
Db::getTableInfo('think_user', 'pk');

 

查詢語法

查詢表達式

查詢表達式支持大部分的SQL查詢語法,也是 ThinkPHP 查詢語言的精髓,查詢表達式的使用格式:

where('字段名','表達式','查詢條件');
whereOr('字段名','表達式','查詢條件');

表達式不分大小寫,支持的查詢表達式有下面幾種,分別表示的含義是:

表達式查詢的用法示例如下:

EQ :等於(=)

例如:

where('id','eq',100);
where('id','=',100);

和下面的查詢等效

where('id',100);

  表示的查詢條件就是id=100

NEQ:不等於()

例如:

where('id','neq',100);
where('id','<>',100);

  表示的查詢條件就是id>100

GET:大於等於(>=)

例如:

where('id','egt',100);
where('id','>=',100);

  表示的查詢條件就是id>=100

LT:小於(<)

例如:

where('id','lt',100);
where('id','<',100);

  表示的查詢條件就是id<100

ELT:小於等於(<=)

例如:

where('id','elt',100);
where('id','<=',100);

  表示的查詢條件就是 id <= 100

[NOT] LIKE: 同sql的LIKE

例如:

where('name','like','thinkphp%')

  查詢條件就變成 name like 'thinkphp%'

V5.0.5+ 版本開始,like查詢支持使用數組

where('name','like',['%think','php%'],'OR');

[NOT] BETWEEN: 同sql的[not] between

例如:

where('id','between','1,8');
where('id','between',[1,8]);
## 兩條語句等效

  查詢條件就變成 'id BETWEEN 1 AND 8'

[NOT] IN:同sql的[not] in

例如:

where('id','not in','1,5,8');
where('id','not in',[1,5,8]);
## 兩條語句等效

  查詢條件就變成 'id NOT IN (1,5,8)','[NOT] IN' 查詢支持使用閉包方式

[NOT] NULL:查詢字段是否(不)是`Null`

例如:

where('name', null);
where('title','null');
where('name','not null');

如果你需要查詢一個字段的值爲字符串`null`或者`not null`,應該使用:

where('title','=', 'null');
where('name','=', 'not null');

EXP:表達式

支持更復雜的查詢情況 例如:

where('id','in','1,3,8');

可以改成:

where('id','exp',' IN (1,3,8) ');

  `exp`查詢的條件不會被當成字符串,所以後面的查詢條件可以使用任何SQL支持的語法,包括使用函數和字段名稱。

 

鏈式操作

數據庫提供的鏈式操作方法,可以有效的提高數據存取的代碼清晰度和開發效率,並且支持所有的CURD操作。

使用也比較簡單,假如我們現在要查詢一個User表的滿足狀態爲1的前10條記錄,並希望按照用戶的創建時間 排序 ,代碼如下:

Db::table('think_user')
    ->where('status',1)
    ->order('create_time')
    ->limit(10)
    ->select();

這裏的 where 、 order 和 limit 方法就被稱之爲鏈式操作方法,除了select方法必須放到最後一個外(因爲select方法並不是鏈式操作方法),鏈式操作的方法調用順序沒有先後,例如,下面的代碼和上面的等效:

Db::table('think_user')
    ->order('create_time')
    ->limit(10)
    ->where('status',1)
    ->select();

其實不僅僅是查詢方法可以使用連貫操作,包括所有的CURD方法都可以使用,例如:

Db::table('think_user')
    ->where('id',1)
    ->field('id,name,email')
    ->find();
Db::table('think_user')
    ->where('status',1)
    ->where('id',1)
    ->delete();

鏈式操作在完成查詢後會自動清空鏈式操作的所有傳值。簡而言之,鏈式操作的結果不會帶入後面的其它查詢。

系統支持的鏈式操作方法有:

  所有的連貫操作都返回當前的模型實例對象(this),其中帶*標識的表示支持多次調用。

where

where方法的用法是ThinkPHP查詢語言的精髓,也是ThinkPHP ORM的重要組成部分和亮點所在,可以完成包括普通查詢、表達式查詢、快捷查詢、區間查詢、組合查詢在內的查詢操作。where方法的參數支持字符串和數組,雖然也可以使用對象但並不建議。

表達式查詢

新版的表達式查詢採用全新的方式,查詢表達式的使用格式:

Db::table('think_user')
    ->where('id','>',1)
    ->where('name','thinkphp')
    ->select();

更多的表達式查詢語法,可以參考查詢語法部分。

數組條件

可以通過數組方式批量設置查詢條件。

普通查詢

最簡單的數組查詢方式如下:

$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查詢條件傳入查詢方法
Db::table('think_user')->where($map)->select();
// 助手函數
db('user')->where($map)->select();

最後生成的SQL語句是

SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

表達式查詢

可以在數組條件中使用查詢表達式,例如:

$map['id'] = ['>',1];
$map['mail'] = ['like','%[email protected]%'];
Db::table('think_user')->where($map)->select();

字符串條件

使用字符串條件直接查詢和操作,例如:

Db::table('think_user')->where('type=1 AND status=1')->select();

最後生成的SQL語句是

SELECT * FROM think_user WHERE type=1 AND status=1

使用字符串條件的時候,建議配合預處理機制,確保更加安全,例如:

Db::table('think_user')->where("id=:id and username=:name")->bind(['id'=>[1,\PDO::PARAM_INT],'name'=>'thinkphp'])->select();

table

table方法主要用於指定操作的數據表。

一般情況下,操作模型的時候系統能夠自動識別當前對應的數據表,所以,使用table方法的情況通常是爲了:

  1. 切換操作的數據表;

  2. 對多表進行操作;

例如:

Db::table('think_user')->where('status>1')->select();

也可以在table方法中指定數據庫,例如:

Db::table('db_name.think_user')->where('status>1')->select();

table方法指定的數據表需要完整的表名,但可以採用下面的方式簡化數據表前綴的傳入,例如:

Db::table('__USER__')->where('status>1')->select();

會自動獲取當前模型對應的數據表前綴來生成 think_user 數據表名稱。

需要注意的是table方法不會改變數據庫的連接,所以你要確保當前連接的用戶有權限操作相應的數據庫和數據表。 切換數據表後,系統會自動重新獲取切換後的數據表的字段緩存信息。

如果需要對多表進行操作,可以這樣使用:

Db::field('user.name,role.title')
->table('think_user user,think_role role')
->limit(10)->select();

爲了儘量避免和mysql的關鍵字衝突,可以建議使用數組方式定義,例如:

Db::field('user.name,role.title')
->table(['think_user'=>'user','think_role'=>'role'])
->limit(10)->select();

使用數組方式定義的優勢是可以避免因爲表名和關鍵字衝突而出錯的情況。

alias

alias用於設置當前數據表的別名,便於使用其他的連貫操作例如join方法等。

示例:

Db::table('think_user')->alias('a')->join('__DEPT__ b ','b.user_id= a.id')->select();

最終生成的SQL語句類似於:

SELECT * FROM think_user a INNER JOIN think_dept b ON b.user_id= a.id

v5.0.2+ 版本開始,可以傳入數組批量設置數據表以及別名,例如:

Db::table('think_user')->alias(['think_user'=>'user','think_dept'=>'dept'])->join('think_dept','dept.user_id= user.id')->select();

最終生成的SQL語句類似於:

SELECT * FROM think_user user INNER JOIN think_dept dept ON dept.user_id= user.id

field

field方法屬於模型的連貫操作方法之一,主要目的是標識要返回或者操作的字段,可以用於查詢和寫入操作。

用於查詢

指定字段

在查詢操作中field方法是使用最頻繁的。

Db::table('think_user')->field('id,title,content')->select();

這裏使用field方法指定了查詢的結果集中包含id,title,content三個字段的值。執行的SQL相當於:

SELECT id,title,content FROM table

可以給某個字段設置別名,例如:

Db::table('think_user')->field('id,nickname as name')->select();

執行的SQL語句相當於:

SELECT id,nickname as name FROM table

使用SQL函數

可以在field方法中直接使用函數,例如:

Db::table('think_user')->field('id,SUM(score)')->select();

執行的SQL相當於:

SELECT id,SUM(score) FROM table

  除了select方法之外,所有的查詢方法,包括find等都可以使用field方法。

使用數組參數

field方法的參數可以支持數組,例如:

Db::table('think_user')->field(['id','title','content'])->select();

最終執行的SQL和前面用字符串方式是等效的。

數組方式的定義可以爲某些字段定義別名,例如:

Db::table('think_user')->field(['id','nickname'=>'name'])->select();

執行的SQL相當於:

SELECT id,nickname as name FROM table

對於一些更復雜的字段要求,數組的優勢則更加明顯,例如:

Db::table('think_user')->field(['id','concat(name,"-",id)'=>'truename','LEFT(title,7)'=>'sub_title'])->select();

執行的SQL相當於:

SELECT id,concat(name,'-',id) as truename,LEFT(title,7) as sub_title FROM table

獲取所有字段

如果有一個表有非常多的字段,需要獲取所有的字段(這個也許很簡單,因爲不調用field方法或者直接使用空 的field方法都能做到):

Db::table('think_user')->select();
Db::table('think_user')->field('*')->select();

上面的用法是等效的,都相當於執行SQL:

SELECT * FROM table

但是這並不是我說的獲取所有字段,而是顯式的調用所有字段(對於對性能要求比較高的系統,這個要求並不過分,起碼是一個比較好的習慣),下面的用法可以完成預期的作用:

Db::table('think_user')->field(true)->select();

  field(true) 的用法會顯式的獲取數據表的所有字段列表,哪怕你的數據表有100個字段。

字段排除

如果我希望獲取排除數據表中的 content 字段(文本字段的值非常耗內存)之外的所有字段值,我們就可 以使用field方法的排除功能,例如下面的方式就可以實現所說的功能:

Db::table('think_user')->field('content',true)->select();

則表示獲取除了content之外的所有字段,要排除更多的字段也可以:

Db::table('think_user')->field('user_id,content',true)->select();
//或者用
Db::table('think_user')->field(['user_id','content'],true)->select();

  注意:字段排除功能不支持跨表和join操作。

用於寫入

除了查詢操作之外,field方法還有一個非常重要的安全功能--字段合法性檢測。field方法結合數據庫的寫入方法使用就可以完成表單提交的字段合法性檢測,如果我們在表單提交的處理方法中使用了:

Db::table('think_user')->field('title,email,content')->insert($data);

即表示表單中的合法字段只有 title , email 和 content 字段,無論用戶通過什麼手段更改或者添加了瀏覽器的提交字段,都會直接屏蔽。因爲,其他是所有字段我們都不希望由用戶提交來決定,你可以通過自動完成功能定義額外的字段寫入。

order

order方法屬於模型的連貫操作方法之一,用於對操作的結果排序。

用法如下:

Db::table('think_user')->where('status=1')->order('id desc')->limit(5)->select();

注意:連貫操作方法沒有順序,可以在select方法調用之前隨便改變調用順序。

支持對多個字段的排序,例如:

Db::table('think_user')->where('status=1')->order('id desc,status')->limit(5)->select();

  如果沒有指定desc或者asc排序規則的話,默認爲asc。

如果你的字段和mysql關鍵字有衝突,那麼建議採用數組方式調用,例如:

Db::table('think_user')->where('status=1')->order(['order','id'=>'desc'])->limit(5)->select();

limit

limit方法也是模型類的連貫操作方法之一,主要用於指定查詢和操作的數量,特別在分頁查詢的時候使用較多。

ThinkPHP的limit方法可以兼容所有的數據庫驅動類的。

限制結果數量

例如獲取滿足要求的10個用戶,如下調用即可:

Db::table('think_user')
    ->where('status=1')
    ->field('id,name')
    ->limit(10)
    ->select();

limit方法也可以用於寫操作,例如更新滿足要求的3條數據:

Db::table('think_user')
    ->where('score=100')
    ->limit(3)
    ->update(['level'=>'A']);

分頁查詢

用於文章分頁查詢是limit方法比較常用的場合,例如:

Db::table('think_article')->limit('10,25')->select();

表示查詢文章數據,從第10行開始的25條數據(可能還取決於where條件和order排序的影響 這個暫且不提。

你也可以這樣使用,作用是一樣的:

Db::table('think_article')->limit(10,25)->select();

  對於大數據表,儘量使用limit限制查詢結果,否則會導致很大的內存開銷和性能問題。

page

page方法也是模型的連貫操作方法之一,是完全爲分頁查詢而誕生的一個人性化操作方法。

我們在前面已經瞭解了關於limit方法用於分頁查詢的情況,而page方法則是更人性化的進行分頁查詢的方法,例如還是以文章列表分頁爲例來說,如果使用limit方法,我們要查詢第一頁和第二頁(假設我們每頁輸出10條數據)寫法如下:

// 查詢第一頁數據
Db::table('think_article')->limit('0,10')->select();
// 查詢第二頁數據
Db::table('think_article')->limit('10,10')->select();

雖然利用擴展類庫中的分頁類Page可以自動計算出每個分頁的limit參數,但是如果要自己寫就比較費力了,如果用page方法來寫則簡單多了,例如:

// 查詢第一頁數據
Db::table('think_article')->page('1,10')->select();
// 查詢第二頁數據
Db::table('think_article')->page('2,10')->select();

顯而易見的是,使用page方法你不需要計算每個分頁數據的起始位置,page方法內部會自動計算。

和limit方法一樣,page方法也支持2個參數的寫法,例如:

Db::table('think_article')->page(1,10)->select();
// 和下面的用法等效
Db::table('think_article')->page('1,10')->select();

page方法還可以和limit方法配合使用,例如:

Db::table('think_article')->limit(25)->page(3)->select();

當page方法只有一個值傳入的時候,表示第幾頁,而limit方法則用於設置每頁顯示的數量,也就是說上面的寫法等同於:

Db::table('think_article')->page('3,25')->select();

group

GROUP方法也是連貫操作方法之一,通常用於結合合計函數,根據一個或多個列對結果集進行分組。

group方法只有一個參數,並且只能使用字符串。

例如,我們都查詢結果按照用戶id進行分組統計:

Db::table('think_user')
    ->field('user_id,username,max(score)')
    ->group('user_id')
    ->select();

生成的SQL語句是:

SELECT user_id,username,max(score) FROM think_score GROUP BY user_id

也支持對多個字段進行分組,例如:

Db::table('think_user')
    ->field('user_id,test_time,username,max(score)')
    ->group('user_id,test_time')
    ->select();

生成的SQL語句是:

SELECT user_id,test_time,username,max(score) FROM think_score GROUP BY user_id,test_time

having

HAVING方法也是連貫操作之一,用於配合group方法完成從分組的結果中篩選(通常是聚合條件)數據。

having方法只有一個參數,並且只能使用字符串,例如:

Db::table('think_user')
    ->field('username,max(score)')
    ->group('user_id')
    ->having('count(test_time)>3')
    ->select();

生成的SQL語句是:

SELECT username,max(score) FROM think_score GROUP BY user_id HAVING count(test_time)>3

join

join通常有下面幾種類型,不同類型的join操作會影響返回的數據結果。

  • INNER JOIN: 等同於 JOIN(默認的JOIN類型),如果表中有至少一個匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行

說明

object join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] )

  JOIN方法也是連貫操作方法之一,用於根據兩個或多個表中的列之間的關係,從這些表中查詢數據。

參數

join

  要關聯的(完整)表名以及別名

支持三種寫法:

  • 寫法1:[ '完整表名或者子查詢'=>'別名' ]
  • 寫法2:'完整表名 別名'
  • 寫法3:'不帶數據表前綴的表名'

condition

  關聯條件。可以爲字符串或數組, 爲數組時每一個元素都是一個關聯條件。

type

  關聯類型。可以爲:INNER、LEFT、RIGHT、FULL,不區分大小寫,默認爲INNER。

返回值

模型對象

舉例

Db::table('think_artist')
    ->alias('a')
    ->join('think_work w','a.id = w.artist_id')
    ->join('think_card c','a.card_id = c.id')
    ->select();
Db::table('think_artist')
    ->alias('a')
    ->join('__WORK__ w','a.id = w.artist_id')
    ->join('__CARD__ c','a.card_id = c.id')
    ->select();
$join = [
    ['think_work w','a.id=w.artist_id'],
    ['think_card c','a.card_id=c.id'],
];
Db::table('think_user')->alias('a')->join($join)->select();

以上三種寫法的效果一樣, __WORK__ 和__CARD__ 在最終解析的時候會轉換爲 think_work 和 think_card 。注意:'_表名_'這種方式中間的表名需要用大寫

如果不想使用別名,後面的條件就要使用表全名,可以使用下面這種方式

Db::table('think_user')->join('__WORK__','__ARTIST__.id = __WORK__.artist_id')->select();

默認採用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成

Db::table('think_user')->alias('a')->join('word w','a.id = w.artist_id','RIGHT')->select();

表名也可以是一個子查詢

$subsql = Db::table('think_work')->where(['status'=>1])->field('artist_id,count(id) count')->group('artist_id')->buildSql();
Db::table('think_user')->alias('a')->join([$subsql=> 'w'], 'a.artist_id = w.artist_id')->select();

因buildSql返回的語句帶有(),所以這裏不需要在兩端再加上()。

union

UNION操作用於合併兩個或多個 SELECT語句的結果集。

使用示例:

Db::field('name')
    ->table('think_user_0')
    ->union('SELECT name FROM think_user_1')
    ->union('SELECT name FROM think_user_2')
    ->select();

閉包用法:

Db::field('name')
    ->table('think_user_0')
    ->union(function($query){
        $query->field('name')->table('think_user_1');
    })
    ->union(function($query){
        $query->field('name')->table('think_user_2');
    })
    ->select();            

或者

Db::field('name')
    ->table('think_user_0')
    ->union(['SELECT name FROM think_user_1','SELECT name FROM think_user_2'])
->select();

支持UNION ALL 操作,例如:

Db::field('name')
    ->table('think_user_0')
    ->union('SELECT name FROM think_user_1',true)
    ->union('SELECT name FROM think_user_2',true)
    ->select();

或者

Db::field('name')
    ->table('think_user_0')
    ->union(['SELECT name FROM think_user_1','SELECT name FROM think_user_2'],true)
    ->select();

每個union方法相當於一個獨立的SELECT語句。

  注意:UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條SELECT 語句中的列的順序必須相同。

distinct

DISTINCT 方法用於返回唯一不同的值 。

例如數據庫表中有以下數據

以下代碼會返回 user_login 字段不同的數據

Db::table('think_user')->distinct(true)->field('user_login')->select();

生成的SQL語句是:

SELECT DISTINCT user_login FROM think_user

返回以下數組

array(2) {
    [0] => array(1) {
        ["user_login"] => string(7) "chunice"
    }
    [1] => array(1) {
        ["user_login"] => string(5) "admin"
    }
}

distinct方法的參數是一個布爾值。

lock

Lock方法是用於數據庫的鎖機制,如果在查詢或者執行操作的時候使用:

lock(true);

就會自動在生成的SQL語句最後加上 FOR UPDATE 或者 FOR UPDATE NOWAIT (Oracle數據庫)。

cache

cache方法用於查詢緩存操作,也是連貫操作方法之一。 cache可以用於 select 、 find 、 value 和 column 方法,以及其衍生方法,使用 cache 方法後,在緩存有效期之內不會再次進行數據庫查詢操作,而是直接獲取緩存中的數據,關於數據緩存的類型和設置可以參考緩存部分。

下面舉例說明,例如,我們對find方法使用cache方法如下:

Db::table('think_user')->where('id=5')->cache(true)->find();

第一次查詢結果會被緩存,第二次查詢相同的數據的時候就會直接返回緩存中的內容,而不需要再次進行數據庫查詢操作。

默認情況下, 緩存有效期是由默認的緩存配置參數決定的,但 cache 方法可以單獨指定,例如:

Db::table('think_user')->cache(true,60)->find();
// 或者使用下面的方式 是等效的
Db::table('think_user')->cache(60)->find();

表示對查詢結果的緩存有效期60秒。

cache方法可以指定緩存標識:

Db::table('think_user')->cache('key',60)->find();

  指定查詢緩存的標識可以使得查詢緩存更有效率。

這樣,在外部就可以通過 \think\Cache 類直接獲取查詢緩存的數據,例如:

$result = Db::table('think_user')->cache('key',60)->find();
$data = \think\Cache::get('key');

cache 方法支持設置緩存標籤,例如:

Db::table('think_user')->cache('key',60,'tagName')->find();

緩存自動更新

這裏的緩存自動更新是指一旦數據更新或者刪除後會自動清理緩存(下次獲取的時候會自動重新緩存)。

當你刪除或者更新數據的時候,可以使用cache方法手動更新(清除)緩存,例如:

Db::table('think_user')->cache('user_data')->select([1,3,5]);
Db::table('think_user')->cache('user_data')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('think_user')->cache('user_data')->select([1,5]);

最後查詢的數據不會受第一條查詢緩存的影響,確保查詢和更新或者刪除使用相同的緩存標識才能自動清除緩存。

如果使用 find 方法並且使用主鍵查詢的情況,不需要指定緩存標識,會自動清理緩存,例如:

Db::table('think_user')->cache(true)->find(1);
Db::table('think_user')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('think_user')->cache(true)->find(1);

最後查詢的數據會是更新後的數據。

comment

COMMENT方法 用於在生成的SQL語句中添加註釋內容,例如:

Db::table('think_score')->comment('查詢考試前十名分數')
    ->field('username,score')
    ->limit(10)
    ->order('score desc')
    ->select();

最終生成的SQL語句是:

SELECT username,score FROM think_score ORDER BY score desc LIMIT 10 /* 查詢考試前十名分數*/

fetchSql

fetchSql用於直接返回SQL而不是執行查詢,適用於任何的CURD操作方法。 例如:

$result = Db::table('think_user')->fetchSql(true)->find(1);

輸出result結果爲: 

SELECT * FROM think_user where id = 1

force

force 方法用於數據集的強制索引操作,例如:

Db::table('think_user')->force('user')->select();

  對查詢強制使用user索引,user必須是數據表實際創建的索引名稱。

bind

bind方法用於手動參數綁定,大多數情況,無需進行手動綁定,系統會在查詢和寫入數據的時候自動使用參數綁定。

bind方法用法如下:

// 用於查詢
Db::table('think_user')
    ->where('id',':id')
    ->where('name',':name')
    ->bind(['id'=>[10,\PDO::PARAM_INT],'name'=>'thinkphp'])
    ->select();
// 用於寫入
Db::table('think_user')
    ->bind(['id'=>[10,\PDO::PARAM_INT],'email'=>'[email protected]','name'=>'thinkphp'])
    ->where('id',':id')
    ->update(['name'=>':name','email'=>':email');

partition

partition 方法用於是數據庫水平分表

partition($data, $field, $rule);
// $data 分表字段的數據
// $field 分表字段的名稱
// $rule 分表規則

  注意:不要使用任何 SQL 語句中會出現的關鍵字當表名、字段名,例如 order 等。會導致數據模型拼裝 SQL 語句語法錯誤。

partition 方法用法如下:

// 用於寫入
$data = [
    'user_id' => 110,
    'user_name' => 'think'
];
$rule = [
    'type' => 'mod', // 分表方式
    'num' => 10 // 分表數量
];
Db::name('log')
    ->partition(['user_id' => 110], "user_id", $rule)
    ->insert($data);
// 用於查詢
Db::name('log')
    ->partition(['user_id' => 110], "user_id", $rule)
    ->where(['user_id' => 110])
    ->select();

strict

strict 方法用於設置是否嚴格檢查字段名,用法如下:

// 關閉字段嚴格檢查
Db::name('user')
    ->strict(false)
    ->insert($data);

  注意,系統默認值是由數據庫配置參數 fields_strict 決定,因此修改數據庫配置參數可以進行全局的嚴格檢查配置,如下:

// 關閉嚴格檢查字段是否存在
'fields_strict' => false,

  如果開啓字段嚴格檢查的話,在更新和寫入數據庫的時候,一旦存在非數據表字段的值,則會拋出異常。

failException

failException 設置查詢數據爲空時是否需要拋出異常,如果不傳入任何參數,默認爲開啓,用於 select 和 find方法,例如:

// 數據不存在的話直接拋出異常
Db:name('blog')->where(['status' => 1])->failException()->select();
// 數據不存在返回空數組 不拋異常
Db:name('blog')->where(['status' => 1])->failException(false)->select();

或者可以使用更方便的查空報錯

// 查詢多條
Db:name('blog')->where(['status' => 1])->selectOrFail();
// 查詢單條
Db:name('blog')->where(['status' => 1])->findOrFail();

sequence

sequence 方法用於 pgsql 數據庫指定自增序列名,其它數據庫不必使用,用法爲:

Db::name('user')->sequence('id')->insert(['name'=>'thinkphp']);

 

posted @ 2019-03-29 12:00 鍵盤演繹青春 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章