1. 程式人生 > >thinkphp5 資料庫和模型詳解 之2 查詢構造器及高階技巧

thinkphp5 資料庫和模型詳解 之2 查詢構造器及高階技巧

1、掌握查詢構造器對於掌握資料庫和模型的查詢操作非常關鍵
2、使用查詢構造器一般都是自動例項化查詢類,Db類的任何方法都會自動呼叫connect方法返回連線物件例項,然後呼叫連線物件的查詢構造器方法會自動例項化查詢類。
3、db助手函式預設每次呼叫都會重新連線資料庫(目的是確保你的每次db函式呼叫不會相互影響),你可以使用db('data',[],false)方式解決。
4、CURL關鍵方法
查詢方法作用描述
table指定查詢資料表
field指定查詢欄位
where指定查詢條件
order指定結果排序
limit指定查詢結果數
find查詢一條記錄
select查詢資料集
insert寫入資料
update更新資料
delete刪除資料
輔助方法(輔助查詢用的,也稱為鏈式方法,例如table、field、where、order和limit等方法),一個是真正的查詢方法(find、select、insert、update和delete方法),查詢方法是必須的,而輔助方法是可選的,並且輔助方法必須在查詢方法之前被呼叫,並且在查詢呼叫之後自動失效。
5、在新版框架的架構設計規範中,我們建議資料表的命名不使用字首設計,表字首其實已經是一種過時的設計了,很多時候跨庫的設計比表字首的設計來的更靈活和實用,而且字首設計(尤其是在混合用的情況下)帶來的一些困惑和問題卻是很多新手最大的苦惱,所以何必自尋煩惱(如果你一定要採用字首設計,那麼請用name方法替代table方法,並且在資料庫配置檔案中配置prefix引數,我也不攔著你,哭的時候別找我^_^)
6、新增   返回值也是影響(新增)的記錄數
//如果主鍵自增則不需要寫入id。
// 插入單個記錄
Db::table('data') ->insert(['id' => 8, 'name' => 'thinkphp']);
// 插入多個記錄
Db::table('data')->insertAll([
['id' => 9, 'name' => 'thinkphp'],
['id' => 10, 'name' => 'topthink'],
]);
// 獲取上次寫入的自增Id
$id = Db::getLastInsID();


// 插入單個記錄 並返回自增Id
$id = Db::table('data')->insertGetId(['name' => 'kancloud']);
// strict(false)方法忽略錯誤繼續執行
$id = Db::table('data')->strict(false)->insertGetId(['name' => 'kancloud']);


7、更新
// 更新記錄
Db::table('data')->where('id', 8)->update(['name' => "framework"]);
//主鍵更新
Db::table('data')->update(['id' => 8, 'name' => "framework"]);
//過濾 即使謝了name和email,但是 field 指定只更新name
Db::table('data')->field(['name'])->where('id', 8)->update([
            'name' => 'framework', 
            'email' => '
[email protected]
'
        ]);
//指定欄位更新 setField 其實最終也是呼叫update
Db::table('data')->where('id', 8)->setField('name','framework');


8、對於數字型別的欄位的步長更新,框架提供了兩個專門的方法用於遞增和遞減操作
9、讀取 查詢
//column的返回型別永遠都是陣列,不受resultset_type引數的影響。
//單資料
$data = Db::table('data'->where('id', 8)->find();
$data = Db::table('data')->find(8)
//多資料查詢
$list = Db::table('data')->where('id','in', [1, 5, 8])->select();
$list = Db::table('data')->select([1,5,8]);
foreach ($list as $data) {
    echo $data['name'];
}
// 返回某個欄位的值
Db::table('data')->where('id', 1)->value('name');
// 獲取name列的陣列
Db::table('data')->where('status', 1)->column('name');
// 指定索引
Db::table('data')->where('status', 1)->column('name', 'id');
10、資料集 
// 資料集返回型別
    'resultset_type'  => 'collection',
二維陣列和資料集物件的區別在於,資料集物件提供了更多的內建資料處理方法,但在基本使用上,這兩種方式沒有不同
11、刪除
// 刪除資料
Db::name('data')->where('id', 18)->delete();
// 主鍵刪除
Db::name('data')->delete(18);
Db::name('data')->delete([1, 5, 8]);
// 刪除所有資料
Db::name('data')->delete(true);
12、事實上,對於業務資料表,基本上不建議使用刪除操作,而是使用軟刪除(邏輯刪除,其實執行的是資料表的更新操作)替代實際的物理刪除。軟刪除屬於模型的功能設計
13、鏈式方法
//辨別一個方法是否屬於鏈式方法的一個顯著特徵就是看這個方法是否返回當前的物件例項
//下面兩個語句生成的sql一樣,完全等效
$list = Db::table('data')->where('id', '>', 1)->limit(8)->select();
$list = Db::limit(8)->where('id', '>', 1)->table('data')->select();
//多個where方法和order方法的呼叫順序最終影響了生成的SQL語句
說明:
鏈式方法支援所有的CURD操作;
鏈式方法本身只是返回查詢物件,只有執行查詢後才會返回結果,而且只能在查詢方法之前被呼叫;
不同鏈式方法的呼叫順序不影響查詢;
相同鏈式方法的呼叫順序可能會影響查詢(至少會影響SQL語句)
鏈式方法在完成查詢後會自動失效;
同一個鏈式方法在CURD操作中的作用可能不同;
鏈式方法僅針對CURD方法,對原生查詢無效


14、查詢語句
要掌握查詢語言的核心,謹記:2個方法,3個用法,8個要訣。
2個方法是:
whereAND條件查詢
whereOrOR條件查詢
3個用法就是表示式、陣列和閉包用法,並且是支援混合使用的
8個要訣:
在使用查詢的過程中謹記下面8個要訣,幫助你更好的完成查詢。
查詢條件的呼叫次序就是生成SQL的條件順序;
查詢欄位用&分割表示對多個欄位使用AND查詢;
查詢欄位用|分割表示對多個欄位使用OR查詢;
對同一個查詢欄位多次呼叫非等查詢條件會合並查詢;
閉包查詢和EXP查詢會在生成的查詢語句兩邊加上括號;
用閉包查詢替代3.2版本的組合查詢;
除了EXP查詢外,其它查詢都會自動使用引數繫結;
如果查詢條件來自使用者輸入,儘量使用表示式和閉包查詢,陣列條件查詢務必使用官方推薦的方法獲取變數;

系統支援的鏈式操作方法有:
//其中帶*標識的表示支援多次呼叫。
連貫操作作用 支援的引數型別
where*用於AND查詢字串、陣列和物件
whereOr*用於OR查詢字串、陣列和物件
whereXor*用於XOR查詢字串、陣列和物件
whereTime*用於時間日期的快捷查詢字串
table用於定義要操作的資料表名稱字串和陣列
alias用於給當前資料表定義別名字串和陣列
field*用於定義要查詢的欄位(支援欄位排除)字串和陣列
order*用於對結果排序字串和陣列
limit用於限制查詢結果數量字串和數字
page用於查詢分頁(內部會轉換成limit)字串和數字
group用於對查詢的group支援字串
having用於對查詢的having支援字串
join*用於對查詢的join支援字串和陣列
union*用於對查詢的union支援字串、陣列和物件
view*用於檢視查詢 字串、陣列
distinct用於查詢的distinct支援布林值
lock用於資料庫的鎖機制布林值
cache用於查詢快取 支援多個引數
relation*用於關聯查詢字串
with*用於關聯預載入 字串、陣列
bind*用於資料繫結運算元組或多個引數
comment用於SQL註釋字串
force用於資料集的強制索引字串
master用於設定主伺服器讀取資料布林值
strict用於設定是否嚴格檢測欄位名是否存在布林值
sequence用於設定Pgsql的自增序列名字串
failException用於設定沒有查詢到資料是否丟擲異常布林值
partition用於設定分表資訊陣列 字串
data*用於設定寫入資料(5.0.5+)陣列
inc*用於設定欄位遞增 (5.0.5+)字串
dec*用於設定欄位遞減(5.0.5+)字串

exp*用於設定SQL表示式(5.0.5+)字串

高階查詢技巧
1、獲取查詢SQL
// 不會進行實際的查詢   返回SQL字串
$result = Db::table('user')
    ->fetchSql(true)
    ->where('id', 1)
    ->find();
echo $result;
2、聚合查詢
方法說明
count統計數量,引數是要統計的欄位名(可選)
max獲取最大值,引數是要統計的欄位名(必須)
min獲取最小值,引數是要統計的欄位名(必須)
avg獲取平均值,引數是要統計的欄位名(必須)
sum獲取總分,引數是要統計的欄位名(必須)
// 查詢使用者ID是1的使用者成績總分
Db::table('score')
    ->where('user_id', 1)
    ->sum('score');
3、快捷查詢
對於多個欄位相同查詢條件的查詢,系統提供了簡化寫法,多個欄位之間用|分割表示OR查詢,用&分割表示AND查詢,例如:
Db::table('user')
    ->where('name|title', 'like', 'thinkphp%')
    ->where('create_time&update_time', '>', 0)
    ->find();


//要求thinkphp要5.0.5+
方法作用
whereNull查詢欄位是否為Null
whereNotNull查詢欄位是否不為Null
whereIn欄位IN查詢
whereNotIn欄位NOT IN查詢
whereBetween欄位BETWEEN查詢
whereNotBetween欄位NOT BETWEEN查詢
whereLike欄位LIKE查詢
whereNotLike欄位NOT LIKE查詢
whereExistsEXISTS條件查詢
whereNotExistsNOT EXISTS條件查詢
whereExp表示式查詢
Db::table('user')
    ->whereNotNull('name')
    ->whereIn('id', [1, 2, 3])
    ->whereLike('name', '%think%')
    ->whereExists(function ($query) {
        $query->table('profile')
            ->whereBetween('user_id', [1, 10]);
    })
    ->select();


4、快捷更新
在寫入操作的時候,經常需要使用函式或者運算,為此框架提供了幾個快捷更新方法,包括
方法描述
setField更新欄位值
setInc遞增更新欄位值
setDec遞減更新欄位值
data設定資料(5.0.5+)
inc遞增欄位值(5.0.5+)
dec遞減欄位值(5.0.5+)
exp使用SQL表示式寫入欄位值(5.0.5+)
5、動態查詢
getByFieldName根據某個欄位查詢
getFieldByFieldName根據某個欄位獲取某個值
6、時間查詢 等
// 查詢建立時間在2016-1-1~2016-7-1的資料
$result = Db::name('data')
    ->whereTime('create_time', 'between', ['2016-1-1', '2016-7-1'])
    ->select();
dump($result);
7、檢視查詢


如果需要快捷查詢多個表的資料,推薦使用檢視查詢,相當於通過多次使用view方法在資料庫建立了一個檢視,例如:


$result = Db::view('user', 'id,name,status')
    ->view('profile', ['name' => 'truename', 'phone', 'email'], 'profile.user_id=user.id')
    ->where('status', 1)
    ->order('id desc')
    ->select();
dump($result);









相關推薦

thinkphp5 資料庫模型 2 查詢構造高階技巧

1、掌握查詢構造器對於掌握資料庫和模型的查詢操作非常關鍵 2、使用查詢構造器一般都是自動例項化查詢類,Db類的任何方法都會自動呼叫connect方法返回連線物件例項,然後呼叫連線物件的查詢構造器方法會自動例項化查詢類。 3、db助手函式預設每次呼叫都會重新連線資料庫(目的是

機器學習中的概率模型概率密度估計方法VAE生成式模型二(作者簡介)

AR aca rtu href beijing cert school start ica Brief Introduction of the AuthorChief Architect at 2Wave Technology Inc. (a startup company

機器學習中的概率模型概率密度估計方法VAE生成式模型五(第3章 EM算法)

ado vpd dea bee OS deb -o blog Oz 機器學習中的概率模型和概率密度估計方法及VAE生成式模型詳解之五(第3章 之 EM算法)

機器學習中的概率模型概率密度估計方法VAE生成式模型六(第3章 VI/VB算法)

dac term http 51cto -s mage 18C watermark BE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

機器學習中的概率模型概率密度估計方法VAE生成式模型七(第4章 梯度估算)

.com 概率 roc 生成 詳解 time 學習 style BE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?機器學習中的概率模型和概率密度估計方法及V

機器學習中的概率模型概率密度估計方法VAE生成式模型八(第4章 AEVBVAE)

RM mes 9.png size mar evb DC 機器 DG ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

機器學習中的概率模型概率密度估計方法VAE生成式模型九(第5章 總結)

ces mark TP 生成 機器 分享 png ffffff images ? ?機器學習中的概率模型和概率密度估計方法及VAE生成式模型詳解之九(第5章 總結)

java用JBarcode元件生成條形碼(支援自定義字型顏色),圖文2-1

前言: JBarcode入門教程我就不寫了,可以參考:點選開啟連結 我的這篇教程和上篇部落格的不同之處: 1 上篇部落格直接生成二維碼圖片放到d盤的某個資料夾下,我的二維碼生成二維碼後直接用Base64編碼然後返回到前臺頁面。 2 上篇部落格只介紹了生成商品條形碼,其他二維

umeng(友盟)實現第三方登入分享登入

一、簡單介紹 因為一個平臺一個平臺進行弄太麻煩,也不夠統一,所以領導選擇了umeng(我的內心是拒絕的),umeng的文件寫的便於查詢,但是比較分散,對於比較熟悉的很好用,沒接觸過umeng的肯定一臉懵逼,比如我,所以,我整理一篇,以後也好用到。 本文以6.

javaCV開發2:推流實現,推本地攝像頭視訊到流媒體伺服器以及攝像頭錄製視訊功能實現(基於javaCV-FFMPEG、javaCV-openCV)

javaCV系列文章: 補充篇: 歡迎大家積極開心的加入討論群 javacpp-ffmpeg: 前言: 本章將在上一章的基礎上,增加視訊推流到流媒體伺服器和視訊錄製的功能; 功能:實現邊播放邊錄製/推流,停止預覽即停止錄製/推流 提示:

紅黑樹知識全面紅黑樹介紹旋轉

一、二叉查詢樹(二叉查詢樹、二叉搜尋樹 ) 二叉排序樹(Binary Sort Tree)或者是一棵空樹;或者是具有下列性質的二叉樹: 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 左

JDBC與mySQL資料庫的連線基本操作一

JDBC詳解 JDBC詳解 一 JDBC基本操作 MySQL的JDBC驅動包: mysql-connector-java-5.1.3

各種音視訊編解碼學習 編解碼學習筆記(三):Mpeg系列——Mpeg 1Mpeg 2

    最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyofbitbit

機器學習中的概率模型概率密度估計方法 VAE生成式模型二)

簡介     非監督機器學習(Unsupervised Machine Learning)中的資料分佈密度估計(Density Estimation)、樣本取樣(Sampling)與生成(Generation,或Synthesis,即合成)等幾類任務具有重要的應用價值,這從近

R數據可視化----ggplot2標度、坐標軸圖例

abs 調整 所有 不同的 size n) 默認 表達 idt 標度控制著數據到圖形屬性的映射,當有需要時,ggplot2會自動添加一個默認的標度。我們確實可以在不了解標度運行原理的情況下畫出許多圖形,但理解標度並學會如何操縱它們則將賦予我們對圖形更強的控制能力。 每一種圖

【轉】中文分詞HMM模型

實現 含義 jieba 順序 清晰 bsp 中國 matrix 統計 關於HMM模型的介紹,網上的資料已經爛大街,但是大部分都是在背書背公式,本文在此針對HMM模型在中文分詞中的應用,講講實現原理。 盡可能的撇開公式,撇開推導。結合實際開源代碼作為例子,爭取做到雅俗共賞,

網絡通信協議三TCP/IP模型

udp protocol bubuko 傳遞 alt 公司 技術 png 代名詞 TCP/IP模型 註:PDU:Protocol Date Unit:表示對等層之間傳遞的數據單位 TCP:Transmission Control Protocol:傳輸控制協議 UD

【shell】Linux shell breakcontinue

shell break linux 腳本 break和continue都可以在循環中使用,但是兩個的功能有點不同,比如break是跳出整個循環,而continue則是跳出本次循環,繼續下個循環,下面我們會通過例子來演示這兩個的不同之處。 ** 例子:打印數字1-10,如果 i&gt

機器學習中的概率模型概率密度估計方法VAE生成式模型之一(簡介)

價值 新書 The aar 生成 syn TE keras 第一章 A Gentle Introduction to Probabilistic Modeling and Density Estimation in Machine LearningAndA Detailed

Android中APK簽名工具jarsignerapksigner

內容 value signature align light 文件簽名 item als release 一.工具介紹 jarsigner是JDK提供的針對jar包簽名的通用工具, 位於JDK/bin/jarsigner.exe apksigner是Google官方提