亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

tp5.1 框架數據庫高級查詢技巧實例總結

 更新時間:2020年05月25日 11:32:30   作者:人生如初見_張默  
這篇文章主要介紹了tp5.1 框架數據庫高級查詢技巧,結合實例形式總結分析了tp5.1 框架數據庫快捷查詢、區(qū)間查詢、批量查詢、閉包查詢等相關高級查詢使用技巧,需要的朋友可以參考下

本文實例講述了tp5.1 框架數據庫高級查詢技巧。分享給大家供大家參考,具體如下:

快捷查詢

快捷查詢方式是一種多字段相同查詢條件的簡化寫法,可以進一步簡化查詢條件的寫法,在多個字段之間用|分割表示OR查詢,用&分割表示AND查詢,可以實現下面的查詢,例如:

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

生成的查詢SQL是:

SELECT * FROM 
 `think_user` 
WHERE ( 
 `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) 
AND ( 
 `create_time` > 0 AND `update_time` > 0 ) 
LIMIT 1

快捷查詢支持所有的查詢表達式。

區(qū)間查詢

區(qū)間查詢是一種同一字段多個查詢條件的簡化寫法,例如:

Db::table('think_user')
 ->where('name', ['like', '%thinkphp%'], ['like', '%kancloud%'], 'or')
 ->where('id', ['>', 0], ['<>', 10], 'and')
 ->find();

生成的SQL語句為:

SELECT * FROM 
 `think_user` 
WHERE ( 
 `name` LIKE '%thinkphp%' OR `name` LIKE '%kancloud%' ) 
AND ( 
 `id` > 0 AND `id` <> 10 )
LIMIT 1

區(qū)間查詢的查詢條件必須使用數組定義方式,支持所有的查詢表達式。

下面的查詢方式是錯誤的:

Db::table('think_user')
 ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp'])
 ->where('id', 5, ['<>', 10], 'or')
 ->find();

區(qū)間查詢其實可以用下面的方式替代,更容易理解,因為查詢構造器支持對同一個字段多次調用查詢條件,例如:

Db::table('think_user')
 ->where('name', 'like', '%think%')
 ->where('name', 'like', '%php%')
 ->where('id', 'in', [1, 5, 80, 50])
 ->where('id', '>', 10)
 ->find();

批量(字段)查詢

可以進行多個條件的批量條件查詢定義,例如:

Db::table('think_user')
 ->where([
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ['id', '>', 0],
 ['status', '=', 1],
 ])
 ->select();

生成的SQL語句為:

SELECT * FROM 
 `think_user` 
WHERE 
 `name` LIKE 'thinkphp%' 
AND 
 `title` LIKE '%thinkphp' 
AND 
 `id` > 0 
AND 
 `status` = '1'

注意,V5.1.7+版本數組方式如果使用exp查詢的話,一定要用raw方法。

Db::table('think_user')
 ->where([
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ['id', 'exp', Db::raw('>score')],
 ['status', '=', 1],
 ])
 ->select();

數組查詢方式,確保你的查詢數組不能被用戶提交數據控制,用戶提交的表單數據應該是作為查詢數組的一個元素傳入,如下:

Db::table('think_user')
 ->where([
 ['name', 'like', $name . '%'],
 ['title', 'like', '%' . $title],
 ['id', '>', $id],
 ['status', '=', $status],
 ])
 ->select();

注意,相同的字段的多次查詢條件可能會合并,如果希望某一個where方法里面的條件單獨處理,可以使用下面的方式,避免被其它條件影響。

$map = [
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ['id', '>', 0],
 ];
Db::table('think_user')
 ->where([ $map ])
 ->where('status',1)
 ->select();

生成的SQL語句為:

SELECT * FROM 
 `think_user` 
WHERE ( 
 `name` LIKE 'thinkphp%' 
AND 
 `title` LIKE '%thinkphp' 
AND 
 `id` > 0 ) 
AND 
 `status` = '1'

如果使用下面的多個條件組合

$map1 = [
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ];
 
$map2 = [
 ['name', 'like', 'kancloud%'],
 ['title', 'like', '%kancloud'],
 ]; 
 
Db::table('think_user')
 ->whereOr([ $map1, $map2 ])
 ->select();

生成的SQL語句為:

SELECT * FROM 
 `think_user` 
WHERE ( 
 `name` LIKE 'thinkphp%' 
AND 
 `title` LIKE '%thinkphp' ) 
OR ( 
 `name` LIKE 'kancloud%' 
AND 
 `title` LIKE '%kancloud' )

善用多維數組查詢,可以很方便的拼裝出各種復雜的SQL語句

數組對象查詢(V5.1.21+)

對于習慣或者重度依賴數組查詢條件的用戶來說,可以選擇數組對象查詢,該對象完成了普通數組方式查詢和系統(tǒng)的查詢表達式之間的橋接,但相較于系統(tǒng)推薦的查詢表達式方式而言,需要注意變量的安全性,避免產生SQL注入的情況。

使用方法如下:

use think\db\Where;
 
$map = [
 'name' => ['like', 'thinkphp%'],
 'title' => ['like', '%think%'],
 'id' => ['>', 10],
 'status' => 1,
];
 
$where  = new Where;
$where['id'] = ['in', [1, 2, 3]];
$where['title'] = ['like', '%php%'];
 
Db::table('think_user')
 ->where(new Where($map))
 ->whereOr($where->enclose())
 ->select();

enclose方法表示該查詢條件兩邊會加上括號包起來。

使用數組對象查詢的情況請一定要注意做好數據類型檢查,盡量避免讓用戶決定你的數據。

生成的SQL是:

SELECT * FROM 
 `think_user` 
WHERE 
 `name` LIKE 'thinkphp%' 
AND 
 `title` LIKE '%think%' 
AND 
 `id` > 10 
AND 
 `status` =1 
OR ( 
 `id` IN (1,2,3) 
AND 
 `title` LIKE '%php%' )

閉包查詢

$name = 'thinkphp';
$id = 10;
Db::table('think_user')->where(function ($query) use($name, $id) {
 $query->where('name', $name)
 ->whereOr('id', '>', $id);
})->select();

生成的SQL語句為:

SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )

可見每個閉包條件兩邊也會自動加上括號,但需要注意,使用閉包查詢的時候不能使用cache(true)數據緩存,而應該使用指定key的方式例如cache('key')。

混合查詢

可以結合前面提到的所有方式進行混合查詢,例如:

Db::table('think_user')
 ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp'])
 ->where(function ($query) {
 $query->where('id', ['<', 10], ['>', 100], 'or');
 })
 ->select();

生成的SQL語句是:

SELECT * FROM 
 `think_user` 
WHERE ( 
 `name` LIKE 'thinkphp%' 
AND 
 `name` LIKE '%thinkphp' ) 
AND ( 
 `id` < 10 or `id` > 100 )

字符串條件查詢

對于一些實在復雜的查詢,也可以直接使用原生SQL語句進行查詢,例如:

Db::table('think_user')
 ->where('id > 0 AND name LIKE "thinkphp%"')
 ->select();

為了安全起見,我們可以對字符串查詢條件使用參數綁定,例如:

Db::table('think_user')
 ->where('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
 ->select();

V5.1.8+版本開始,如果你要使用字符串條件查詢,推薦使用whereRaw方法。

Db::table('think_user')
 ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
 ->select();

使用Query對象查詢(V5.1.5+)

V5.1.5+版本開始,可以通過調用一次where方法傳入Query對象來進行查詢。

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp');
 
Db::table('think_user')
 ->where($query)
 ->select();

Query對象的where方法僅能調用一次,如果query對象里面使用了非查詢條件的鏈式方法,則不會傳入當前查詢。

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp')
 ->order('id','desc') // 不會傳入后面的查詢
 ->field('name,id'); // 不會傳入后面的查詢
 
Db::table('think_user')
 ->where($query)
 ->where('title','like','thinkphp%') // 有效
 ->select();

快捷方法

系統(tǒng)封裝了一系列快捷方法,用于簡化查詢,包括:

方法 作用
whereOr 字段OR查詢
whereXor 字段XOR查詢
whereNull 查詢字段是否為Null
whereNotNull 查詢字段是否不為Null
whereIn 字段IN查詢
whereNotIn 字段NOT IN查詢
whereBetween 字段BETWEEN查詢
whereNotBetween 字段NOT BETWEEN查詢
whereLike 字段LIKE查詢
whereNotLike 字段NOT LIKE查詢
whereExists EXISTS條件查詢
whereNotExists NOT EXISTS條件查詢
whereExp 表達式查詢
whereColumn 比較兩個字段

下面舉例說明下兩個字段比較的查詢條件whereColumn方法的用法。

查詢update_time大于create_time的用戶數據

Db::table('think_user')
 ->whereColumn('update_time','>','create_time')
 ->select();

生成的SQL語句是:

SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` ) 

查詢namenickname相同的用戶數據

Db::table('think_user')
 ->whereColumn('name','=','nickname')
 ->select();

生成的SQL語句是:

SELECT * FROM `think_user` WHERE ( `name` = `nickname` )

相同字段條件也可以簡化為

Db::table('think_user')
 ->whereColumn('name','nickname')
 ->select();

高級查詢

快捷查詢

快捷查詢方式是一種多字段相同查詢條件的簡化寫法,可以進一步簡化查詢條件的寫法,在多個字段之間用|分割表示OR查詢,用&分割表示AND查詢,可以實現下面的查詢,例如:

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

生成的查詢SQL是:

SELECT * FROM `think_user` 
WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) 
AND ( `create_time` > 0 AND `update_time` > 0 ) 
LIMIT 1

快捷查詢支持所有的查詢表達式。

區(qū)間查詢

區(qū)間查詢是一種同一字段多個查詢條件的簡化寫法,例如:

Db::table('think_user')
 ->where('name', ['like', '%thinkphp%'], ['like', '%kancloud%'], 'or')
 ->where('id', ['>', 0], ['<>', 10], 'and')
 ->find();

生成的SQL語句為:

SELECT * FROM `think_user` 
WHERE ( `name` LIKE '%thinkphp%' OR `name` LIKE '%kancloud%' ) 
AND ( `id` > 0 AND `id` <> 10 ) 
LIMIT 1

區(qū)間查詢的查詢條件必須使用數組定義方式,支持所有的查詢表達式。

下面的查詢方式是錯誤的:

Db::table('think_user')
 ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp'])
 ->where('id', 5, ['<>', 10], 'or')
 ->find();

區(qū)間查詢其實可以用下面的方式替代,更容易理解,因為查詢構造器支持對同一個字段多次調用查詢條件,例如:

Db::table('think_user')
 ->where('name', 'like', '%think%')
 ->where('name', 'like', '%php%')
 ->where('id', 'in', [1, 5, 80, 50])
 ->where('id', '>', 10)
 ->find();

批量(字段)查詢

可以進行多個條件的批量條件查詢定義,例如:

Db::table('think_user')
 ->where([
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ['id', '>', 0],
 ['status', '=', 1],
 ])
 ->select();

生成的SQL語句為:

SELECT * FROM `think_user` 
WHERE `name` LIKE 'thinkphp%' 
AND `title` LIKE '%thinkphp' 
AND `id` > 0 
AND `status` = '1'

注意,V5.1.7+版本數組方式如果使用exp查詢的話,一定要用raw方法。

Db::table('think_user')
 ->where([
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ['id', 'exp', Db::raw('>score')],
 ['status', '=', 1],
 ])
 ->select();

數組查詢方式,確保你的查詢數組不能被用戶提交數據控制,用戶提交的表單數據應該是作為查詢數組的一個元素傳入,如下:

Db::table('think_user')
 ->where([
 ['name', 'like', $name . '%'],
 ['title', 'like', '%' . $title],
 ['id', '>', $id],
 ['status', '=', $status],
 ])
 ->select();

注意,相同的字段的多次查詢條件可能會合并,如果希望某一個where方法里面的條件單獨處理,可以使用下面的方式,避免被其它條件影響。

$map = [
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ['id', '>', 0],
 ];
Db::table('think_user')
 ->where([ $map ])
 ->where('status',1)
 ->select();

生成的SQL語句為:

SELECT * FROM `think_user` 
WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 ) 
AND `status` = '1'

如果使用下面的多個條件組合

$map1 = [
 ['name', 'like', 'thinkphp%'],
 ['title', 'like', '%thinkphp'],
 ];
 
$map2 = [
 ['name', 'like', 'kancloud%'],
 ['title', 'like', '%kancloud'],
 ]; 
 
Db::table('think_user')
 ->whereOr([ $map1, $map2 ])
 ->select();

生成的SQL語句為:

SELECT * FROM `think_user` 
WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' ) 
OR ( `name` LIKE 'kancloud%' AND `title` LIKE '%kancloud' )

善用多維數組查詢,可以很方便的拼裝出各種復雜的SQL語句

數組對象查詢(V5.1.21+)

對于習慣或者重度依賴數組查詢條件的用戶來說,可以選擇數組對象查詢,該對象完成了普通數組方式查詢和系統(tǒng)的查詢表達式之間的橋接,但相較于系統(tǒng)推薦的查詢表達式方方式而言,需要注意變量的安全性,避免產生SQL注入的情況。

使用方法如下:

use think\db\Where;
 
$map = [
 'name' => ['like', 'thinkphp%'],
 'title' => ['like', '%think%'],
 'id' => ['>', 10],
 'status' => 1,
];
 
$where  = new Where;
$where['id'] = ['in', [1, 2, 3]];
$where['title'] = ['like', '%php%'];
 
Db::table('think_user')
 ->where(new Where($map))
 ->whereOr($where->enclose())
 ->select();

enclose方法表示該查詢條件兩邊會加上括號包起來。

使用數組對象查詢的情況請一定要注意做好數據類型檢查,盡量避免讓用戶決定你的數據。

生成的SQL是:

SELECT * FROM `think_user` 
WHERE `name` LIKE 'thinkphp%' 
AND `title` LIKE '%think%' 
AND `id` > 10 
AND `status` =1 
OR ( `id` IN (1,2,3) AND `title` LIKE '%php%' )

閉包查詢

$name = 'thinkphp';
$id = 10;
Db::table('think_user')->where(function ($query) use($name, $id) {
 $query->where('name', $name)
 ->whereOr('id', '>', $id);
})->select();

生成的SQL語句為:

SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )

可見每個閉包條件兩邊也會自動加上括號,但需要注意,使用閉包查詢的時候不能使用cache(true)數據緩存,而應該使用指定key的方式例如cache('key')。

混合查詢

可以結合前面提到的所有方式進行混合查詢,例如:

Db::table('think_user')
 ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp'])
 ->where(function ($query) {
 $query->where('id', ['<', 10], ['>', 100], 'or');
 })
 ->select();

生成的SQL語句是:

SELECT * FROM `think_user` 
WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) 
AND ( `id` < 10 or `id` > 100 )

字符串條件查詢

對于一些實在復雜的查詢,也可以直接使用原生SQL語句進行查詢,例如:

Db::table('think_user')
 ->where('id > 0 AND name LIKE "thinkphp%"')
 ->select();

為了安全起見,我們可以對字符串查詢條件使用參數綁定,例如:

Db::table('think_user')
 ->where('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
 ->select();

V5.1.8+版本開始,如果你要使用字符串條件查詢,推薦使用whereRaw方法。

Db::table('think_user')
 ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
 ->select();

使用Query對象查詢(V5.1.5+)

V5.1.5+版本開始,可以通過調用一次where方法傳入Query對象來進行查詢。

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp');
 
Db::table('think_user')
 ->where($query)
 ->select();

Query對象的where方法僅能調用一次,如果query對象里面使用了非查詢條件的鏈式方法,則不會傳入當前查詢。

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp')
 ->order('id','desc') // 不會傳入后面的查詢
 ->field('name,id'); // 不會傳入后面的查詢
 
Db::table('think_user')
 ->where($query)
 ->where('title','like','thinkphp%') // 有效
 ->select();

快捷方法

系統(tǒng)封裝了一系列快捷方法,用于簡化查詢,包括:

方法 作用
whereOr 字段OR查詢
whereXor 字段XOR查詢
whereNull 查詢字段是否為Null
whereNotNull 查詢字段是否不為Null
whereIn 字段IN查詢
whereNotIn 字段NOT IN查詢
whereBetween 字段BETWEEN查詢
whereNotBetween 字段NOT BETWEEN查詢
whereLike 字段LIKE查詢
whereNotLike 字段NOT LIKE查詢
whereExists EXISTS條件查詢
whereNotExists NOT EXISTS條件查詢
whereExp 表達式查詢
whereColumn 比較兩個字段

下面舉例說明下兩個字段比較的查詢條件whereColumn方法的用法。

查詢update_time大于create_time的用戶數據

Db::table('think_user')
 ->whereColumn('update_time','>','create_time')
 ->select();

生成的SQL語句是:

SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` ) 

查詢namenickname相同的用戶數據

Db::table('think_user')
 ->whereColumn('name','=','nickname')
 ->select();

生成的SQL語句是:

SELECT * FROM `think_user` WHERE ( `name` = `nickname` )

相同字段條件也可以簡化為

Db::table('think_user')
 ->whereColumn('name','nickname')
 ->select();

V5.1.11+版本開始,支持數組方式比較多個字段

Db::name('user')->whereColumn([
	['title', '=', 'name'],
 ['update_time', '>=', 'create_time'],
])->select();

生成的SQL語句是:

SELECT * FROM `think_user` 
WHERE ( `name` = `nickname` AND `update_time` > `create_time` ) 

動態(tài)查詢

查詢構造器還提供了兩個動態(tài)查詢機制,用于簡化查詢條件,包括getBygetFieldBy

動態(tài)查詢 描述
whereFieldName 查詢某個字段的值
whereOrFieldName 查詢某個字段的值
getByFieldName 根據某個字段查詢
getFieldByFieldName 根據某個字段獲取某個值

其中FieldName表示數據表的實際字段名稱的駝峰法表示,假設數據表user中有emailnick_name字段,我們可以這樣來查詢。

// 根據郵箱(email)查詢用戶信息
$user = Db::table('user')
	->whereEmail('thinkphp@qq.com')
 ->find();
 
// 根據昵稱(nick_name)查詢用戶
$email = Db::table('user')
 ->whereNickName('like', '%流年%')
 ->select();
 
// 根據郵箱查詢用戶信息
$user = Db::table('user')
 ->getByEmail('thinkphp@qq.com');
 
// 根據昵稱(nick_name)查詢用戶信息
$user = Db::table('user')
 ->field('id,name,nick_name,email')
 ->getByNickName('流年');
 
// 根據郵箱查詢用戶的昵稱
$nickname = Db::table('user')
 ->getFieldByEmail('thinkphp@qq.com', 'nick_name');
 
// 根據昵稱(nick_name)查詢用戶郵箱
$email = Db::table('user')
 ->getFieldByNickName('流年', 'email');

getBygetFieldBy方法只會查詢一條記錄,可以和其它的鏈式方法搭配使用

條件查詢

5.1的查詢構造器支持條件查詢,例如:

Db::name('user')->when($condition, function ($query) {
 // 滿足條件后執(zhí)行
 $query->where('score', '>', 80)->limit(10);
})->select();

并且支持不滿足條件的分支查詢

Db::name('user')->when($condition, function ($query) {
 // 滿足條件后執(zhí)行
 $query->where('score', '>', 80)->limit(10);
}, function ($query) {
 // 不滿足條件執(zhí)行
 $query->where('score', '>', 60);
});

更多關于thinkPHP相關內容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結》、《ThinkPHP常用方法總結》、《codeigniter入門教程》、《CI(CodeIgniter)框架進階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術總結》。

希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。

相關文章

最新評論