一、數(shù)據(jù)庫
- 1、原生查詢
// 插入記錄
$result = Db::execute('insert into think_data (id, name ,status) values (5, "thinkphp",1)');
dump($result);
// 更新記錄
$result = Db::execute('update think_data set name = "framework" where id = 5 ');
dump($result);
// 查詢數(shù)據(jù)
$result = Db::query('select * from think_data where id = 5');
dump($result);
// 刪除數(shù)據(jù)
$result = Db::execute('delete from think_data where id = 5 ');
dump($result);
// 顯示數(shù)據(jù)庫列表
$result = Db::query('show tables from demo');
dump($result);
// 清空數(shù)據(jù)表
$result = Db::execute('TRUNCATE table think_data');
dump($result);
- 2叮贩、切換數(shù)據(jù)庫
在配置文件中配置db1和db2兩個數(shù)據(jù)庫連接击狮,通過connect方法進(jìn)行切換。
$result = Db::connect('db1')->query('select * from think_data where id = 1');
$result = Db::connect('db2')->query('select * from think_data where id = 1');
connect方法中的配置參數(shù)需要完整定義益老,并且僅僅對當(dāng)此查詢有效彪蓬,下次調(diào)用Db類的時候還是使用默認(rèn)的數(shù)據(jù)庫連接。
- 3捺萌、參數(shù)綁定
在對數(shù)據(jù)庫進(jìn)行操作是時档冬,需要接受外部傳入的參數(shù)。
Db::execute('insert into think_data (id, name ,status) values (?, ?, ?)', [8, 'thinkphp', 1]);
$result = Db::query('select * from think_data where id = ?', [8]);
dump($result);
//支持命名占位符綁定
Db::execute('insert into think_data (id, name , status) values (:id, :name, :status)', ['id' => 10, 'name' => 'thinkphp', 'status' => 1]);
$result = Db::query('select * from think_data where id=:id', ['id' => 10]);
dump($result);
- 4桃纯、查詢構(gòu)造器
// 插入記錄
Db::table('think_data')
->insert(['id' => 18, 'name' => 'thinkphp', 'status' => 1]);
// 更新記錄
Db::table('think_data')
->where('id', 18)
->update(['name' => "hello"]);
// 查詢數(shù)據(jù)
$list = Db::table('think_data')
->where('id', 18)
->select();
// 刪除數(shù)據(jù)
Db::table('think_data')
->where('id', 18)
->delete();
由于在數(shù)據(jù)庫配置文件中添加了數(shù)據(jù)表的前綴為think_酷誓,因此table方法就可以改為name方法。
// 查詢數(shù)據(jù)
$list = Db::name('data')
->where('id', 18)
->select();
dump($list);
還可以通過助手函數(shù)進(jìn)一步簡化代碼态坦。
// 查詢數(shù)據(jù)
$list = $db->where('id', 20)->select();
dump($list);
- 5盐数、鏈?zhǔn)讲僮?/li>
// 查詢十個滿足條件的數(shù)據(jù) 并按照id倒序排列
$list = Db::name('data')
->where('status', 1)
->field('id,name')
->order('id', 'desc')
->limit(10)
->select();
dump($list);
鏈?zhǔn)讲僮鞑环窒群螅灰旁趕elect之前調(diào)用就可以驮配。
- 6娘扩、事務(wù)支持
使用transaction方法,只需要把需要執(zhí)行的事務(wù)操作封裝到閉包里面即可自動完成事務(wù)壮锻。
Db::transaction(function () {
Db::table('think_user')
->delete(1);
Db::table('think_data')
->insert(['id' => 28, 'name' => 'thinkphp', 'status' => 1]);
});
還可以手動控制提交事務(wù):
// 啟動事務(wù)
Db::startTrans();
try {
Db::table('think_user')
->delete(1);
Db::table('think_data')
->insert(['id' => 28, 'name' => 'thinkphp', 'status' => 1]);
// 提交事務(wù)
Db::commit();
} catch (\Exception $e) {
// 回滾事務(wù)
Db::rollback();
}
二琐旁、查詢語言
- 1、查詢表達(dá)式
find方法用來查詢滿足要求的第一條結(jié)果猜绣,存在就返回一個以為數(shù)組灰殴,否則默認(rèn)返回null,也可以拋出異常掰邢;
select方法用來查詢數(shù)據(jù)集牺陶,存在返回一個二維數(shù)組,否則返回空數(shù)組辣之,也可以拋出異常掰伸。
可以支持的查詢表達(dá)式包括如下:
EQ、= 等于(=)
NEQ怀估、<> 不等于(<>)
GT狮鸭、> 大于(>)
EGT、>= 大于等于(>=)
LT多搀、< 小于(<)
ELT歧蕉、<= 小于等于(<=)
LIKE 模糊查詢
[NOT] BETWEEN (不在)區(qū)間查詢
[NOT] IN (不在)IN 查詢
[NOT] NULL 查詢字段是否(不)是NULL
[NOT] EXISTS EXISTS查詢
EXP 表達(dá)式查詢,支持SQL語法
- 2康铭、批量查詢
$result = Db::name('data')
// name 中包含think
->where('name', 'like', '%think%')
->where('id', ['in', [1, 2, 3]], ['between', '5,8'], 'or')
->limit(10)
->select();
dump($result);
使用批量方式:
$result = Db::name('data')
->where([
'id' => [['in', [1, 2, 3]], ['between', '5,8'], 'or'],
'name' => ['like', '%think%'],
])->limit(10)->select();
dump($result);
- 3惯退、快速查詢
當(dāng)多個字段需要使用相同條件時:
$result = Db::name('data')
->where('id&status', '>', 0)
//->where('id|status', '>', 0)
->limit(10)
->select();
dump($result);
- 4、視圖查詢
快速的進(jìn)行多表查詢
$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);
- 5催跪、閉包查詢
直接用方能find和select方法進(jìn)行必包查詢
$result = Db::name('data')->select(function ($query) {
$query->where('name', 'like', '%think%')
->where('id', 'in', '1,2,3')
->limit(10);
});
dump($result);
//相當(dāng)于SELECT * FROM `think_data` WHERE `name` LIKE '%think%' AND `id` IN ('1','2','3') LIMIT 10
- 6锁蠕、使用Query對象
將封裝后的Query對象傳入select方法,使用Query對象的話叠荠,select方法之前調(diào)用的任何的鏈?zhǔn)讲僮鞫际菬o效匿沛。
$query = new \think\db\Query;
$query->name('city')->where('name', 'like', '%think%')
->where('id', 'in', '1,2,3')
->limit(10);
$result = Db::select($query);
dump($result);
- 7、獲取數(shù)值
獲取表中某行的某個值時榛鼎,用value
// 獲取id為8的data數(shù)據(jù)的name字段值
$name = Db::name('data')
->where('id', 8)
->value('name');
dump($name);
- 8逃呼、獲取列數(shù)據(jù)
// 獲取data表的name列
$list = Db::name('data')
->where('status', 1)
->column('name');
dump($list);
- 9、聚合查詢
count 統(tǒng)計(jì)數(shù)量 統(tǒng)計(jì)的字段名(可選)
max 獲取最大值 統(tǒng)計(jì)的字段名(必須)
min 獲取最小值 統(tǒng)計(jì)的字段名(必須)
avg 獲取平均值 統(tǒng)計(jì)的字段名(必須)
sum 獲取總分 統(tǒng)計(jì)的字段名(必須)
- 10者娱、日期查詢
// 查詢創(chuàng)建時間大于2016-1-1的數(shù)據(jù)
$result = Db::name('data')
->whereTime('create_time', '>', '2016-1-1')
->select();
dump($result);
// 查詢本周添加的數(shù)據(jù)
$result = Db::name('data')
->whereTime('create_time', '>', 'this week')
->select();
dump($result);
// 查詢最近兩天添加的數(shù)據(jù)
$result = Db::name('data')
->whereTime('create_time', '>', '-2 days')
->select();
dump($result);
// 查詢創(chuàng)建時間在2016-1-1~2016-7-1的數(shù)據(jù)
$result = Db::name('data')
->whereTime('create_time', 'between', ['2016-1-1', '2016-7-1'])
->select();
dump($result);
- 11抡笼、分塊查詢
當(dāng)查詢數(shù)據(jù)量比較大時,可以將這些數(shù)據(jù)分塊進(jìn)行操作黄鳍。
如:將1萬條數(shù)據(jù)分成100次處理推姻,每次處理100條
Db::name('data')
->where('status', '>', 0)
->chunk(100, function ($list) {
// 處理100條記錄
foreach($list as $data){
}
});