thinkPHP数据库

在数据库配置文件database.php中,有一个是否严格检查字段是否存在的配置项经常用到,因为我们为了达到某些目的,可能经常在表单中设置隐藏域。'fields_strict'  => true,设置为true时数据入库时会检查字段是否完全对应。

一、原生语句执行

//查询
Db::query('select * from think_user where id=?',[8]);
//插入
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
 
//占位符绑定---更安全
Db::query('select * from think_user where id=:id',['id'=>8]);
Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);

二、查询一条数据

Db::name('think_user')->where('id',1)->find();

三、查询多条数据

Db::name('user')->where('status',1)->select();

四、值和列的查询

// 返回某个字段的值
Db::name('think_user')->where('id',1)->value('name');
 
// 返回数组
Db::name('think_user')->where('status',1)->column('name');
 
// 指定索引
Db::name('think_user')->where('status',1)->column('name','id');
Db::name('think_user')->where('status',1)->column('id,name');

关于使用Db类静态方法和使用db助手函数哪个更有效率的问题,老蔡经过查阅资料总结如下:

在Thinkphp5.0.9之前的版本

使用db助手函数默认每次都会重新连接数据库--影响效率

在Thinkphp5.0.9之后的版本

db助手函数默认不再强制重新连接

五、数据分批处理

这里Mark一下,以后研究生成静态文件的时候不知道能不能用的到。

如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。

比如,我们可以全部用户表数据进行分批处理,每次处理 100 个用户记录:
 

Db::table('think_user')->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});
// 或者交给回调方法myUserIterator处理
Db::table('think_user')->chunk(100, 'myUserIterator');

六、查询JSON格式的字段内容

// 查询JSON类型字段 (info字段为json类型)
Db::table('think_user')->where('info$.email','thinkphp@qq.com')->find();

七、查询JSON格式的字段内容

// 查询JSON类型字段 (info字段为json类型)
Db::table('think_user')->where('info$.email','thinkphp@qq.com')->find();

八、添加数据

Db::name('user')->insert($data); //普通新增
 
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID(); //获取新增的ID,也可以理解为获取这个表中的最大ID
 
//或者直接用
Db::name('user')->insertGetId($data); //插入数据的同时返回ID。比如用于新增文章的排序值直接设置为这个ID
 
//添加多条数据---批量添加产品或内容
$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data); //返回添加成功的条数
 

九、修改/更新数据

Db::name('think_user')->where('id', 1)->update(['name' => 'thinkphp']);
 
//update 方法返回影响数据的条数,没修改任何数据返回 0
 
 
Db::name('think_user')->where('id',1)->setField('name', 'thinkphp');
 
//只修改name字段的值
 
// score 字段加 1
Db::table('think_user')->where('id', 1)->setInc('score');
// score 字段加 5
Db::table('think_user')->where('id', 1)->setInc('score', 5);
// score 字段减 1
Db::table('think_user')->where('id', 1)->setDec('score');
// score 字段减 5
Db::table('think_user')->where('id', 1)->setDec('score', 5);
 
//自增或自减字段的值,比如用于文章点击数

十、删除数据

// 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]); //这个全选批量删除很适用
 
// 条件删除    
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();

十一、条件查询

1.AND查询两种方法----就是在name和title中间用&连接

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->where('status',1)
    ->find();
 
Db::table('think_user')
    ->where('name&title','like','%thinkphp')
    ->find();
 
//就是在name和title中间用&连接

2.OR查询两种方法---就是在name和title中间用|连接

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->whereOr('title','like','%thinkphp')
    ->find();
 
Db::table('think_user')
    ->where('name|title','like','%thinkphp')
    ->find();

3.数组条件查询--先定义一个数组然后传入到where里面

$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查询条件传入查询方法
Db::table('think_user')->where($map)->select(); 
 
// 助手函数
db('user')->where($map)->select();
 
//可以使用表达式
$map['id']  = ['>',1];
 
//可以直接写原生--但是不安全
Db::table('think_user')->where('type=1 AND status=1')->select(); 
 

十二、排序

Db::table('think_user')->where('status=1')->order('id desc')->limit(5)->select();

十三、结果去重

Db::table('think_user')->distinct(true)->field('user_login')->select();

十四、直接产生编译后的SQL语句

$result = Db::table('think_user')->fetchSql(true)->find(1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值