ThinkPHP 数据库操作之增删改查

发布时间 - 2021-01-25 00:00:00    点击率:

下面由thinkphp教程栏目给大家介绍thinkphp 数据库操作之增删改查,希望对需要的朋友有所帮助!

基本使用

可以直接使用数据库运行原生SQL操作了,支持 query (查询操作)和 execute (写入操作)方法,并且支持参数绑定。

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::connect($config)->query('select * from think_user where id=:id',['id'=>8]);

config是一个单独的数据库配置,支持数组和字符串,也可以是一个数据库连接的配置参数名。

查询数据

基本查询

查询一个数据使用:

// table方法必须指定完整的数据表名
Db::table('think_user')->where('id',1)->find();

  find 方法查询结果不存在,返回 null

查询数据集使用:

Db::table('think_user')->where('status',1)->select();

  select 方法查询结果不存在,返回空数组

如果设置了数据表前缀参数的话,可以使用

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

  如果你的数据表没有使用表前缀功能,那么name和table方法的一样的效果。

在 find 和 select 方法之前可以使用所有的链式操作方法。

  默认情况下,find和select方法返回的都是数组。

助手函数

系统提供了一个 db 助手函数,可以更方便的查询:

db('user')->where('id',1)->find();
db('user')->where('status',1)->select();

  注意:使用db助手函数默认每次都会重新连接数据库,而使用 Db::name 或者 Db::table 方法的话都 是单例的。db函数如果需要采用相同的链接,可以传入第三个参数,例如:

db('user',[],false)->where('id',1)->find();
db('user',[],false)->where('status',1)->select();

  上面的方式会使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的 配置。

使用Query对象或闭包查询

或者使用查询对象进行查询,例如:

$query = new \think\db\Query();$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);

或者直接使用闭包函数查询,例如:

Db::select(function($query){
  $query->table('think_user')->where('status',1);
});

值和列查询

查询某个字段的值可以用

// 返回某个字段的值
Db::table('think_user')->where('id',1)->value('name');

  value 方法查询结果不存在,返回 null

查询某一列的值可以用

// 返回数组
Db::table('think_user')->where('status',1)->column('name');
// 指定索引
Db::table('think_user')->where('status',1)->column('name','id');

  column 方法查询结果不存在,返回空数组

数据集分批处理

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

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

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

你可以通过从闭包函数中返回false来中止对数据集的处理:

Db::table('think_user')->chunk(100, function($users) {    
// 处理结果集...
    return false;
});

也支持在chunk方法之前调用其它的查询方法,例如:

Db::table('think_user')->where('score','>',80)->chunk(100,function($users) {    foreach ($users as $user) {    
//    
}
});

JSON类型数据查询(mysql V5.0.1 )

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

添加数据

添加一条数据

使用 Db 类的 insert 方法向数据库提交数据

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);

如果你在 database.php 配置文件中配置了数据库前缀( prefix ),那么可以直接使用 Db 类的 name 方法提交数据

Db::name('user')->insert($data);

  insert 方法添加数据成功返回添加成功的条数,insert 正常情况返回 1

添加数据后如果需要返回新增数据的自增主键,可以使用 getLastInsID 方法:

Db::name('user')->insert($data);$userId = Db::name('user')->getLastInsID();

或者直接使用 insertGetId 方法新增数据并返回主键值:

Db::name('user')->insertGetId($data);

  insertGetId 方法添加数据成功返回添加数据的自增主键

添加多条数据

添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可

$data = [
  ['foo' => 'bar', 'bar' => 'foo'],  ['foo' => 'bar1', 'bar' => 'foo1'],  ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);

  insertAll 方法添加数据成功返回添加成功的条数

助手函数

// 添加单条数据
db('user')->insert($data);
// 添加多条数据
db('user')->insertAll($list);

快捷更新

V5.0.5+ 以上版本封装的快捷更新方法 data ,可以配合 insert 使用。

下面举个例子说明用法:

Db::table('data')->data(['name'=>'tp','score'=>1000])->insert();

更新数据

更新数据表中的数据

Db::table('think_user')->where('id', 1)->update(['name' => 'thinkphp']);

如果数据中包含主键,可以直接使用:

Db::table('think_user')->update(['name' => 'thinkphp','id'=>1]);

  update 方法返回影响数据的条数,没修改任何数据返回 0

如果要更新的数据需要使用 SQL 函数或者其它字段,可以使用下面的方式:

Db::table('think_user')->where('id', 1)->update([    'login_time' => ['exp','now()'],
    'login_times' => ['exp','login_times+1'],]);

更新某个字段的值

Db::table('think_user')    ->where('id',1)    ->setField('name', 'thinkphp');

  setField 方法返回影响数据的条数,没修改任何数据字段返回 0

自增或自减一个字段的值

setInc/setDec 如不加第二个参数,默认值为1

// 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);

延迟更新

setInc/setDec 支持延时更新,如果需要延时更新则传入第三个参数

下例中延时10秒,给 score 字段增加1

Db::table('think_user')->where('id', 1)->setInc('score', 1, 10);

  setInc/setDec 方法返回影响数据的条数

助手函数

// 更新数据表中的数据
db('user')->where('id',1)->update(['name' => 'thinkphp']);
// 更新某个字段的值
db('user')->where('id',1)->setField('name','thinkphp');
// 自增 score 字段
db('user')->where('id', 1)->setInc('score');
// 自减 score 字段
db('user')->where('id', 1)->setDec('score');

快捷更新( V5.0.5+ )

V5.0.5+ 以上版本封装的 data 、 inc 、 dec 和 exp 方法属于链式操作方法,可以配合 update 使 用。

下面举个例子说明用法:

Db::table('data')->where('id',1)->inc('read')->dec('score',3)->exp('name','UPPER(name)')->update();

删除数据

删除数据表中的数据

// 根据主键删除
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();

  delete 方法返回影响数据的条数,没有删除返回 0

助手函数

// 根据主键删除
db('user')->delete(1);
// 条件删除
db('user')->where('id',1)->delete();

 


# thinkphp  # 可以使用  # 条数  # 主键  # 不存在  # 链式  # 查询结果  # 可以直接  # 是一个  # 多条  # 可以用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 清除minerd进程的简单方法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Python文本处理实践_日志清洗解析【指导】  微信小程序 require机制详解及实例代码  教你用AI润色文章,让你的文字表达更专业  百度浏览器如何管理插件 百度浏览器插件管理方法  ,交易猫的商品怎么发布到网站上去?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  网站建设保证美观性,需要考虑的几点问题!  如何在宝塔面板中修改默认建站目录?  如何在IIS管理器中快速创建并配置网站?  ,在苏州找工作,上哪个网站比较好?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Python文件操作最佳实践_稳定性说明【指导】  如何在IIS7中新建站点?详细步骤解析  Laravel如何使用Service Container和依赖注入?(代码示例)  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Python文件流缓冲机制_IO性能解析【教程】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Android利用动画实现背景逐渐变暗  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  *服务器网站为何频现安全漏洞?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何基于云服务器快速搭建网站及云盘系统?  如何在 React 中条件性地遍历数组并渲染元素  详解阿里云nginx服务器多站点的配置  如何在VPS电脑上快速搭建网站?  如何在阿里云购买域名并搭建网站?  如何在云主机快速搭建网站站点?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  微信公众帐号开发教程之图文消息全攻略  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel Fortify是什么,和Jetstream有什么关系  Linux系统命令中tree命令详解  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何在七牛云存储上搭建网站并设置自定义域名?  魔方云NAT建站如何实现端口转发?  如何快速打造个性化非模板自助建站?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何选择可靠的免备案建站服务器?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  免费视频制作网站,更新又快又好的免费电影网站?  如何在搬瓦工VPS快速搭建网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?