TP5数据库操作

一、数据库

  • 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);
// 查询数据
$result = Db::query('select * from think_data where id = 5');
dump($result);
// 删除数据
$result = Db::execute('delete from think_data where id = 5 ');
dump($result);
// 显示数据库列表
$result = Db::query('show tables from demo');
dump($result);
// 清空数据表
$result = Db::execute('TRUNCATE table think_data');
dump($result);
  • 2、切换数据库
    在配置文件中配置db1和db2两个数据库连接,通过connect方法进行切换。
$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方法中的配置参数需要完整定义,并且仅仅对当此查询有效,下次调用Db类的时候还是使用默认的数据库连接。

  • 3、参数绑定
    在对数据库进行操作是时,需要接受外部传入的参数。
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、查询构造器
// 插入记录
Db::table('think_data')
    ->insert(['id' => 18, 'name' => 'thinkphp', 'status' => 1]);

// 更新记录
Db::table('think_data')
    ->where('id', 18)
    ->update(['name' => "hello"]);

// 查询数据
$list = Db::table('think_data')
    ->where('id', 18)
    ->select();

// 删除数据
Db::table('think_data')
    ->where('id', 18)
    ->delete();

由于在数据库配置文件中添加了数据表的前缀为think_,因此table方法就可以改为name方法。

// 查询数据
$list = Db::name('data')
    ->where('id', 18)
    ->select();
dump($list);

还可以通过助手函数进一步简化代码。

// 查询数据
$list = $db->where('id', 20)->select();
dump($list);
  • 5、链式操作
// 查询十个满足条件的数据 并按照id倒序排列
$list = Db::name('data')
    ->where('status', 1)
    ->field('id,name')
    ->order('id', 'desc')
    ->limit(10)
    ->select();
dump($list);

链式操作不分先后,只要放在select之前调用就可以。

  • 6、事务支持
    使用transaction方法,只需要把需要执行的事务操作封装到闭包里面即可自动完成事务。
Db::transaction(function () {
    Db::table('think_user')
        ->delete(1);
    Db::table('think_data')
        ->insert(['id' => 28, 'name' => 'thinkphp', 'status' => 1]);
});

还可以手动控制提交事务:

// 启动事务
Db::startTrans();
try {
    Db::table('think_user')
        ->delete(1);
    Db::table('think_data')
        ->insert(['id' => 28, 'name' => 'thinkphp', 'status' => 1]);
    // 提交事务
    Db::commit();
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
}

二、查询语言

  • 1、查询表达式
    find方法用来查询满足要求的第一条结果,存在就返回一个以为数组,否则默认返回null,也可以抛出异常;
    select方法用来查询数据集,存在返回一个二维数组,否则返回空数组,也可以抛出异常。

可以支持的查询表达式包括如下:
EQ、= 等于(=)
NEQ、<> 不等于(<>)
GT、> 大于(>)
EGT、>= 大于等于(>=)
LT、< 小于(<)
ELT、<= 小于等于(<=)
LIKE 模糊查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN 查询
[NOT] NULL 查询字段是否(不)是NULL
[NOT] EXISTS EXISTS查询
EXP 表达式查询,支持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、快速查询
    当多个字段需要使用相同条件时:
$result = Db::name('data')
    ->where('id&status', '>', 0)
    //->where('id|status', '>', 0)
    ->limit(10)
    ->select();
dump($result);   
  • 4、视图查询
    快速的进行多表查询
$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方法进行必包查询
$result = Db::name('data')->select(function ($query) {
    $query->where('name', 'like', '%think%')
        ->where('id', 'in', '1,2,3')
        ->limit(10);
});
dump($result);
//相当于SELECT * FROM `think_data` WHERE `name` LIKE '%think%' AND `id` IN ('1','2','3') LIMIT 10
  • 6、使用Query对象
    将封装后的Query对象传入select方法,使用Query对象的话,select方法之前调用的任何的链式操作都是无效。
$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、获取数值
    获取表中某行的某个值时,用value
// 获取id为8的data数据的name字段值
$name = Db::name('data')
    ->where('id', 8)
    ->value('name');
dump($name);
  • 8、获取列数据
// 获取data表的name列
$list = Db::name('data')
    ->where('status', 1)
    ->column('name');
dump($list);  
  • 9、聚合查询

count 统计数量 统计的字段名(可选)
max 获取最大值 统计的字段名(必须)
min 获取最小值 统计的字段名(必须)
avg 获取平均值 统计的字段名(必须)
sum 获取总分 统计的字段名(必须)

  • 10、日期查询
// 查询创建时间大于2016-1-1的数据
$result = Db::name('data')
    ->whereTime('create_time', '>', '2016-1-1')
    ->select();
dump($result);

// 查询本周添加的数据
$result = Db::name('data')
    ->whereTime('create_time', '>', 'this week')
    ->select();
dump($result);

// 查询最近两天添加的数据
$result = Db::name('data')
    ->whereTime('create_time', '>', '-2 days')
    ->select();
dump($result);

// 查询创建时间在2016-1-1~2016-7-1的数据
$result = Db::name('data')
    ->whereTime('create_time', 'between', ['2016-1-1', '2016-7-1'])
    ->select();
dump($result);
  • 11、分块查询
    当查询数据量比较大时,可以将这些数据分块进行操作。
    如:将1万条数据分成100次处理,每次处理100条
Db::name('data')
    ->where('status', '>', 0)
    ->chunk(100, function ($list) {
        // 处理100条记录
        foreach($list as $data){
            
        }
    });
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容