婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > tp5.1 框架數據庫高級查詢技巧實例總結

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

熱門標簽:電子地圖標注怎么修改 廈門400電話辦理選易號網 梧州市機器人外呼系統怎么樣 地圖標注符號樣式有 菏澤語音外呼系統運營商 天客通地圖標注 公司外呼系統中心 如何在世界地圖標注 臨沂crm外呼系統平臺

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

快捷查詢

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

Db::table('think_user')
 ->where('name|title','like','thinkphp%')
 ->where('create_timeupdate_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

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

區間查詢

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

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

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

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

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

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

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

對于習慣或者重度依賴數組查詢條件的用戶來說,可以選擇數組對象查詢,該對象完成了普通數組方式查詢和系統的查詢表達式之間的橋接,但相較于系統推薦的查詢表達式方式而言,需要注意變量的安全性,避免產生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();

快捷方法

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

方法 作用
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_timeupdate_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

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

區間查詢

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

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

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

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

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

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

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

對于習慣或者重度依賴數組查詢條件的用戶來說,可以選擇數組對象查詢,該對象完成了普通數組方式查詢和系統的查詢表達式之間的橋接,但相較于系統推薦的查詢表達式方方式而言,需要注意變量的安全性,避免產生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();

快捷方法

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

方法 作用
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` ) 

動態查詢

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

動態查詢 描述
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) {
 // 滿足條件后執行
 $query->where('score', '>', 80)->limit(10);
})->select();

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

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

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

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

您可能感興趣的文章:
  • tp5.1 框架路由操作-URL生成實例分析
  • tp5.1 框架join方法用法實例分析
  • tp5.1框架數據庫子查詢操作實例分析
  • tp5.1 框架數據庫常見操作詳解【添加、刪除、更新、查詢】
  • tp5.1 框架查詢表達式用法詳解
  • TP5框架安全機制實例分析
  • TP5框架實現自定義分頁樣式的方法示例
  • PHP tp5中使用原生sql查詢代碼實例

標簽:黃石 郴州 貴陽 迪慶 雞西 瀘州 白城 綿陽

巨人網絡通訊聲明:本文標題《tp5.1 框架數據庫高級查詢技巧實例總結》,本文關鍵詞  tp5.1,框架,數據庫,高級,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《tp5.1 框架數據庫高級查詢技巧實例總結》相關的同類信息!
  • 本頁收集關于tp5.1 框架數據庫高級查詢技巧實例總結的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 巫溪县| 将乐县| 固始县| 武穴市| 巴里| 大宁县| 衡水市| 阿克陶县| 阿鲁科尔沁旗| 天水市| 本溪市| 新安县| 环江| 如东县| 淮滨县| 大关县| 叶城县| 南华县| 花莲县| 谷城县| 永州市| 靖江市| 乳山市| 桐庐县| 湟中县| 开原市| 海原县| 沁水县| 龙州县| 泽州县| 白朗县| 筠连县| 岳阳县| 青浦区| 尉犁县| 张家界市| 奈曼旗| 苏州市| 鄂温| 灵武市| 运城市|