thinkphp v5 鏈?zhǔn)讲僮髌?/h1>

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');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末愈捅,一起剝皮案震驚了整個濱河市遏考,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓝谨,老刑警劉巖灌具,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異譬巫,居然都是意外死亡咖楣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門芦昔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱贿,“玉大人,你說我怎么就攤上這事咕缎≈槭” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵凭豪,是天一觀的道長焙蹭。 經(jīng)常有香客問我,道長嫂伞,這世上最難降的妖魔是什么孔厉? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任拯钻,我火速辦了婚禮,結(jié)果婚禮上烟馅,老公的妹妹穿的比我還像新娘说庭。我一直安慰自己,他們只是感情好郑趁,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布刊驴。 她就那樣靜靜地躺著,像睡著了一般寡润。 火紅的嫁衣襯著肌膚如雪捆憎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天梭纹,我揣著相機與錄音躲惰,去河邊找鬼。 笑死变抽,一個胖子當(dāng)著我的面吹牛础拨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绍载,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诡宗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了击儡?” 一聲冷哼從身側(cè)響起塔沃,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阳谍,沒想到半個月后蛀柴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡矫夯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年鸽疾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训貌。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肮韧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旺订,到底是詐尸還是另有隱情,我是刑警寧澤超燃,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布区拳,位于F島的核電站,受9級特大地震影響意乓,放射性物質(zhì)發(fā)生泄漏樱调。R本人自食惡果不足惜约素,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笆凌。 院中可真熱鬧圣猎,春花似錦、人聲如沸乞而。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爪模。三九已至欠啤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屋灌,已是汗流浹背洁段。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留共郭,地道東北人祠丝。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像除嘹,于是被迫代替她去往敵國和親写半。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容