TP5數(shù)據(jù)庫操作

一、數(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){
            
        }
    });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市框沟,隨后出現(xiàn)的幾起案子藏古,更是在濱河造成了極大的恐慌,老刑警劉巖忍燥,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧晕,死亡現(xiàn)場離奇詭異,居然都是意外死亡梅垄,警方通過查閱死者的電腦和手機(jī)厂捞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來队丝,“玉大人靡馁,你說我怎么就攤上這事』茫” “怎么了臭墨?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膘盖。 經(jīng)常有香客問我裙犹,道長,這世上最難降的妖魔是什么衔憨? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮袄膏,結(jié)果婚禮上践图,老公的妹妹穿的比我還像新娘。我一直安慰自己沉馆,他們只是感情好码党,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布德崭。 她就那樣靜靜地躺著,像睡著了一般揖盘。 火紅的嫁衣襯著肌膚如雪眉厨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天兽狭,我揣著相機(jī)與錄音憾股,去河邊找鬼。 笑死箕慧,一個胖子當(dāng)著我的面吹牛服球,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颠焦,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斩熊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伐庭?” 一聲冷哼從身側(cè)響起粉渠,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圾另,沒想到半個月后霸株,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盯捌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年淳衙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饺著。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡箫攀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幼衰,到底是詐尸還是另有隱情靴跛,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布渡嚣,位于F島的核電站梢睛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏识椰。R本人自食惡果不足惜绝葡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腹鹉。 院中可真熱鬧藏畅,春花似錦、人聲如沸功咒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榜旦,卻和暖如春幽七,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溅呢。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工澡屡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藕届。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓挪蹭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親休偶。 傳聞我的和親對象是個殘疾皇子梁厉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容