欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

tp5.1 框架數(shù)據(jù)庫高級查詢技巧實例總結(jié)

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

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

快捷查詢

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

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ū)間查詢的查詢條件必須使用數(shù)組定義方式,支持所有的查詢表達式。

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

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

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

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+版本數(shù)組方式如果使用exp查詢的話,一定要用raw方法。

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

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

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' )

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

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

對于習(xí)慣或者重度依賴數(shù)組查詢條件的用戶來說,可以選擇數(shù)組對象查詢,該對象完成了普通數(shù)組方式查詢和系統(tǒng)的查詢表達式之間的橋接,但相較于系統(tǒng)推薦的查詢表達式方式而言,需要注意變量的安全性,避免產(chǎn)生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方法表示該查詢條件兩邊會加上括號包起來。

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

生成的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)數(shù)據(jù)緩存,而應(yīng)該使用指定key的方式例如cache('key')

混合查詢

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

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 )

字符串條件查詢

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

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

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

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+版本開始,可以通過調(diào)用一次where方法傳入Query對象來進行查詢。

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

Query對象的where方法僅能調(diào)用一次,如果query對象里面使用了非查詢條件的鏈?zhǔn)椒椒?,則不會傳入當(dāng)前查詢。

$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的用戶數(shù)據(jù)

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

生成的SQL語句是:

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

查詢namenickname相同的用戶數(shù)據(jù)

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查詢,可以實現(xiàn)下面的查詢,例如:

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ū)間查詢的查詢條件必須使用數(shù)組定義方式,支持所有的查詢表達式。

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

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

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

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+版本數(shù)組方式如果使用exp查詢的話,一定要用raw方法。

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

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

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' )

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

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

對于習(xí)慣或者重度依賴數(shù)組查詢條件的用戶來說,可以選擇數(shù)組對象查詢,該對象完成了普通數(shù)組方式查詢和系統(tǒng)的查詢表達式之間的橋接,但相較于系統(tǒng)推薦的查詢表達式方方式而言,需要注意變量的安全性,避免產(chǎn)生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方法表示該查詢條件兩邊會加上括號包起來。

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

生成的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)數(shù)據(jù)緩存,而應(yīng)該使用指定key的方式例如cache('key')。

混合查詢

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

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 )

字符串條件查詢

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

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

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

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+版本開始,可以通過調(diào)用一次where方法傳入Query對象來進行查詢。

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

Query對象的where方法僅能調(diào)用一次,如果query對象里面使用了非查詢條件的鏈?zhǔn)椒椒?,則不會傳入當(dāng)前查詢。

$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的用戶數(shù)據(jù)

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

生成的SQL語句是:

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

查詢namenickname相同的用戶數(shù)據(jù)

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+版本開始,支持數(shù)組方式比較多個字段

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)查詢

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

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

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

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

getBygetFieldBy方法只會查詢一條記錄,可以和其它的鏈?zhǔn)椒椒ù钆涫褂?/p>

條件查詢

5.1的查詢構(gòu)造器支持條件查詢,例如:

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);
});

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

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

相關(guān)文章

最新評論