1. 查詢表達(dá)式
表達(dá)式 | 含義 |
---|---|
EQ、= | 等于(=) |
NEQ、<> | 不等于(<>) |
GT票唆、> | 大于(>) |
EGT、>= | 大于等于(>=) |
LT似踱、< | 小于(<) |
ELT、<= | 小于等于(<=) |
LIKE | 模糊查詢 |
[NOT] BETWEEN | (不在)區(qū)間查詢 |
[NOT] IN | (不在)IN 查詢 |
[NOT] NULL | 查詢字段是否(不)是NULL |
[NOT] EXISTS | EXISTS查詢 |
EXP | 表達(dá)式查詢,支持SQL語法 |
> time | 時間比較 |
< time | 時間比較 |
between time | 時間比較 |
notbetween time | 時間比較 |
2. where/whereOr
- 可以使用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方法進行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方法在復(fù)雜的查詢條件中經(jīng)常需要配合一起混合使用核芽,下面舉個例子:
$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也支持?jǐn)?shù)組條件和字符串條件
$map['id'] = ['>',1];
$map['mail'] = ['like','%thinkphp@qq.com%'];
Db::table('think_user')->where($map)->select(); //數(shù)組條件
Db::table('think_user')->where('type=1 AND status=1')->select(); //字符串
3. table
- table方法中指定數(shù)據(jù)庫:
table('數(shù)據(jù)庫名.表名')
需要改用戶名有權(quán)限訪問
- 多表進行進行操作
Db::field('user.name,role.title')
->table(['think_user'=>'user','think_role'=>'role'])
->limit(10)->select();
4. alias
alias用于設(shè)置當(dāng)前數(shù)據(jù)表的別名囚戚,便于使用其他的連貫操作例如join方法等≡颍可以是數(shù)組(v5.0.2+指定多個表的別名)和字符串(當(dāng)前表的別名)
Db::table('think_user')->alias('a')->join('__DEPT__ b ','b.user_id= a.id')->select();
Db::table('think_user')->alias(['think_user'=>'user','think_dept'=>'dept'])->join('think_dept','dept.user_id= user.id')->select();
5. field
返回或者操作的字段
- 用于查詢
- 指定字段
Db::table('think_user')->field('id,title,content')->select();//字符串 Db::table('think_user')->field(['id','title','content'])->select();//數(shù)組
- 設(shè)置別名
Db::table('think_user')->field('id,nickname as name')->select(); Db::table('think_user')->field(['id','nickname'=>'name'])->select();
- 使用SQL函數(shù)(數(shù)組方式的可變性更大些)
Db::table('think_user')->field('id,SUM(score)')->select(); Db::table('think_user')->field(['id','concat(name,"-",id)'=>'truename','LEFT(title,7)'=>'sub_title'])->select();
- 字段排除
如果我希望獲取排除數(shù)據(jù)表中的content字段(文本字段的值非常耗內(nèi)存)之外的所有字段值驰坊,我們就可以使用field方法的排除功能,例如下面的方式就可以實現(xiàn)所說的功能:
Db::table('think_user')->field('content',true)->select();
- 用于寫入------字段合法性檢測
Db::table('think_user')->field('title,email,content')->insert($data);
即表示表單中的合法字段只有title,email和content字段哮独,無論用戶通過什么手段更改或者添加了瀏覽器的提交字段拳芙,都會直接屏蔽。因為皮璧,其他是所有字段我們都不希望由用戶提交來決定舟扎,你可以通過自動完成功能定義額外的字段寫入。
在開啟數(shù)據(jù)表字段嚴(yán)格檢查的情況下悴务,提交了非法字段會拋出異常睹限,可以在數(shù)據(jù)庫設(shè)置文件中設(shè)置:
// 關(guān)閉嚴(yán)格字段檢查,默認(rèn)開啟
'fields_strict' => false,
6. order
Db::table('think_user')->where('status=1')->order('id desc,status')->limit(5)->select();
如果沒有指定desc或者asc排序規(guī)則的話讯檐,默認(rèn)為asc羡疗。
7. limit
主要用于指定查詢和操作的數(shù)量
Db::table('think_user')
->where('status=1')
->field('id,name')
->limit(10)
->select();
8. page
分頁查詢:page(頁碼數(shù),每頁數(shù)量)
// 查詢第一頁數(shù)據(jù)
Db::table('think_article')->page('1,10')->select();
9. group
用于結(jié)合合計函數(shù)别洪,根據(jù)一個或多個列對結(jié)果集進行分組
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
10. having
用于配合group方法完成從分組的結(jié)果中篩選
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
having方法只有一個參數(shù)叨恨,并且只能使用字符串
11. join
用于根據(jù)兩個或多個表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)挖垛。
join通常有下面幾種類型特碳,不同類型的join操作會影響返回的數(shù)據(jù)結(jié)果。
- INNER JOIN: 等同于 JOIN(默認(rèn)的JOIN類型),如果表中有至少一個匹配晕换,則返回行
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配站宗,也從右表返回所有的行
- FULL JOIN: 只要其中一個表中存在匹配闸准,就返回行(mysql好像是不支持的)
object join ( mixed join [, mixed $condition = null [, string $type = '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();
默認(rèn)采用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();//buildSql()生成sql語句
Db::table('think_user')->alias('a')->join([$subsql=> 'w'], 'a.artist_id = w.artist_id')->select();
12. UNION
UNION操作用于合并兩個或多個 SELECT 語句的結(jié)果集(不重復(fù)的夷家,允許重復(fù)的可以使用第二個參數(shù))。
Db::field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1')
->union('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();
13. distinct
方法用于返回結(jié)果集中不重復(fù)的值
$subsql = Db::table('cms_user')->distinct(true)->field('user_name')->select();
dump(subsql );
返回:
14. cache
cache方法用于查詢緩存操作
cache可以用于select敏释、find库快、value和column方法,以及其衍生方法钥顽,使用cache方法后义屏,在緩存有效期之內(nèi)不會再次進行數(shù)據(jù)庫查詢操作,而是直接獲取緩存中的數(shù)據(jù),關(guān)于數(shù)據(jù)緩存的類型和設(shè)置可以參考緩存部分闽铐。緩存默認(rèn)是永久蝶怔,這點需要注意的
'cache' => [
// 驅(qū)動方式
'type' => 'File',
// 緩存保存目錄
'path' => CACHE_PATH,
// 緩存前綴
'prefix' => '',
// 緩存有效期 0表示永久緩存
'expire' => 0,
],
示例:
不加任何設(shè)置
Db::table('think_user')->cache(60)->find();//不建議使用,建議帶上便簽或者標(biāo)識兄墅,因為我現(xiàn)在的版本默認(rèn)的在更新和刪除里面數(shù)據(jù)的時候不會刪除緩存踢星。
添加標(biāo)識
$result = Db::table('think_user')->cache('key',60)->find();
$data = \think\Cache::get('key');//獲取緩存
支持設(shè)置緩存標(biāo)簽
Db::table('think_user')->cache('key',60,'tagName')->find();
-
緩存自動更新
緩存自動更新,是指當(dāng)刪除或者更新數(shù)據(jù)時隙咸,會自動刪除對應(yīng)緩存沐悦,(但是不能刪除無標(biāo)簽和無標(biāo)識的,我的版本是5.0.10)五督。
Db::table('cms_user')->update(['id'=>1,'user_name'=>'thinkphp2']);//更改數(shù)據(jù),先執(zhí)行下面兩條藏否,在執(zhí)行詞條,然后在執(zhí)行下面兩條
$subsql = Db::table('cms_user')->distinct(true)->cache('name',true)->field('user_name')->select();//生成緩存
return json_encode($subsql);//頁面輸出數(shù)據(jù)
頁面輸出:
[{"user_name":"thinkphp2"},{"user_name":"yan2"},{"user_name":"yan"}]
15. fetchSql
fetchSql用于直接返回SQL而不是執(zhí)行查詢概荷,適用于任何的CURD操作方法秕岛。
$result = Db::table('think_user')->fetchSql(true)->find(1);
輸出result結(jié)果為: (SELECT * FROM think_user where id = 1)
16. bind
bind方法用于手動參數(shù)綁定,大多數(shù)情況误证,無需進行手動綁定继薛,系統(tǒng)會在查詢和寫入數(shù)據(jù)的時候自動使用參數(shù)綁定。
// 用于查詢
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'=>'thinkphp@qq.com','name'=>'thinkphp'])
->where('id',':id')
->update(['name'=>':name','email'=>':email');