查詢數據
基本查詢
查詢一個(ge)數據使(shi)用:
// table方法必(bi)須指定完整的數據表名
Db::table('think_user')->where('id',1)->find();
find 方法查詢結果不存在(zai),返回 null
查詢數(shu)據集使用:
Db::table('think_user')->where('status',1)->select();
select 方法(fa)查詢結果(guo)不存在,返回空數組
如果(guo)設置了數據表前(qian)綴參數的(de)話(hua),可以使用
Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();
如果你的數據表(biao)沒(mei)有使用表(biao)前綴功能,那么name和(he)table方(fang)法的一樣的效果。
在find和select方法之前(qian)可以使用(yong)所有的鏈式操作方法。
默認情況下,find和select方(fang)法(fa)返回的都是(shi)數組(zu)。
主從查詢
如果你(ni)使用(yong)了分布式數(shu)據庫(ku),那么(me)默認情(qing)況下查(cha)詢操(cao)作(zuo)都是在從數(shu)據庫(ku)中進行,如果你(ni)在一(yi)些特殊的情(qing)況下需要從主庫(ku)讀取數(shu)據,可以使用(yong):
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
Db::name('user')->master()->where('id',1)->find();
V5.0.19+版本開始,支持一旦某個表寫入(ru)了數據,那么(me)當前請求的后(hou)續(xu)查詢操作(zuo)都可以(yi)自動從主庫讀取。
你需要在數據庫配置(zhi)文(wen)件中增(zeng)加(jia)下面的配置(zhi)參數:
// 從主庫讀(du)取數據
'read_master' => true,
如果你只需要對某個表進行操作,可以使用readMaster方法。
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
->readMaster()
->insert($data);
// 后續(xu)所有關于(yu)該數據(ju)表的(de)查詢都會走主庫
也可以讓后續(xu)所(suo)有數據表的查詢(xun)都走主(zhu)庫
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
->readMaster(true)
->insert($data);
// 后(hou)續(xu)所有數據表的查詢都會(hui)走主(zhu)庫(ku)
助手函數
系統提供了一個db助手(shou)函(han)數,可以(yi)更方便(bian)的查(cha)詢:
db('user')->where('id',1)->find();
db('user')->where('status',1)->select();
注意:使用db助手函數默認每次都會重新連接數據庫,而使用
Db::name或者Db::table方法的(de)話(hua)都是單例(li)的(de)。db函數如果需(xu)要采用相同的(de)鏈接,可以傳入第三個參數,例(li)如:db('user',[],false)->where('id',1)->find(); db('user',[],false)->where('status',1)->select();上面的(de)方式會使用同一個數據庫連(lian)接,第(di)二個參(can)數為數據庫的(de)連(lian)接參(can)數,留空表示采用數據庫配(pei)置文件的(de)配(pei)置。
| 版本 | 調整功能 |
|---|---|
| 5.0.9 | db助手函數默認不再強制重新連接 |
使用Query對象或閉包查詢
或者使用查詢(xun)(xun)對象進行查詢(xun)(xun),例如:
$query = new hinkdbQuery();
$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);
或者直接使用(yong)閉(bi)包函數查詢,例如:
Db::select(function($query){
$query->table('think_user')->where('status',1);
});
值和列查詢
查詢某(mou)個(ge)字(zi)段的(de)值可以(yi)用(yong)
// 返回某個(ge)字段的值(zhi)
Db::table('think_user')->where('id',1)->value('name');
value 方(fang)法查詢結果不存在,返回 null
查(cha)詢某一列的值(zhi)可以用
// 返回數組
Db::table('think_user')->where('status',1)->column('name');
// 指(zhi)定索(suo)引(yin)
Db::table('think_user')->where('status',1)->column('name','id');
Db::table('think_user')->where('status',1)->column('id,name'); // 同(tong)tp3的(de)getField
column 方(fang)法查詢結果不存在(zai),返回(hui)空數組
數據集分批處理
如果你需要處(chu)理(li)成千上百條數(shu)據(ju)庫記錄,可以考慮使用(yong)chunk方法,該方法一次獲取結(jie)果集的一小塊,然后(hou)填充每一小塊數(shu)據(ju)到要處(chu)理(li)的閉包(bao),該方法在編寫處(chu)理(li)大(da)量數(shu)據(ju)庫記錄的時(shi)候(hou)非常有用(yong)。
比如,我們可以全部用戶(hu)表(biao)數據進行分批(pi)處(chu)理,每次處(chu)理 100 個用戶(hu)記錄:
Db::table('think_user')->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});
// 或者交給回調(diao)方法(fa)myUserIterator處(chu)理
Db::table('think_user')->chunk(100, 'myUserIterator');
你可以(yi)通過(guo)從(cong)閉包函(han)數中返(fan)回(hui)false來中止(zhi)對數據集的處理(li):
Db::table('think_user')->chunk(100, function($users) {
// 處理結(jie)果(guo)集...
return false;
});
也(ye)支持在(zai)chunk方法之前調用其它的(de)查詢方法,例如:
Db::table('think_user')->where('score','>',80)->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});
chunk方法的(de)處理默認是根據主鍵查詢(xun),支持(chi)指定字段,例如:
Db::table('think_user')->chunk(100, function($users) {
// 處(chu)理結果集...
return false;
},'create_time');
V5.0.11版本(ben)開(kai)始,chunk方法(fa)支持指(zhi)定處理數據的(de)順序。
Db::table('think_user')->chunk(100, function($users) {
// 處理結果集...
return false;
},'create_time', 'desc');
JSON類型數據查詢(mysql V5.0.1)
// 查詢(xun)JSON類型字段 (info字段為json類型)
Db::table('think_user')->where('info$.email','thinkphp@qq.com')->find();
