tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】


Posted in PHP onMay 26, 2020

本文实例讲述了tp5.1 框架数据库常见操作。分享给大家供大家参考,具体如下:

tp5.1--数据库添加操作

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

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

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

或者使用data方法配合insert使用。

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

如果你的数据表里面没有foo或者bar字段,那么就会抛出异常。

如果不希望抛出异常,可以使用下面的方法:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->strict(false)->insert($data);

不存在的字段的值将会直接抛弃。

如果是mysql数据库,支持replace写入,例如:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data, true);

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

$userId = 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 方法添加数据成功返回添加成功的条数

如果是mysql数据库,支持replace写入,例如:

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

添加数据

添加一条数据

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

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

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

或者使用data方法配合insert使用。

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

如果你的数据表里面没有foo或者bar字段,那么就会抛出异常。

如果不希望抛出异常,可以使用下面的方法:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->strict(false)->insert($data);

不存在的字段的值将会直接抛弃。

如果是mysql数据库,支持replace写入,例如:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data, true);

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

$userId = 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 方法添加数据成功返回添加成功的条数

如果是mysql数据库,支持replace写入,例如:

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

也可以使用data方法

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

确保要批量添加的数据字段是一致的

如果批量插入的数据比较多,可以指定分批插入,使用limit方法指定每次插入的数量限制。

$data = [
  ['foo' => 'bar', 'bar' => 'foo'],
  ['foo' => 'bar1', 'bar' => 'foo1'],
  ['foo' => 'bar2', 'bar' => 'foo2']
  ...
];
// 分批写入 每次最多100条数据
Db::name('user')->data($data)->limit(100)->insertAll();

tp5.1--数据库删除操作

删除数据

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

最终生成的SQL语句可能是:

DELETE FROM `think_user` WHERE `id` = 1 
DELETE FROM `think_user` WHERE `id` IN (1,2,3) 
DELETE FROM `think_user` WHERE `id` = 1 
DELETE FROM `think_user` WHERE `id` < 10

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

如果不带任何条件调用delete方法会提示错误,如果你确实需要删除所有数据,可以使用

// 无条件删除所有数据
Db::name('user')->delete(true);

最终生成的SQL语句是(删除了表的所有数据):

DELETE FROM `think_user`

一般情况下,业务数据不建议真实删除数据,系统提供了软删除机制(模型中使用软删除更为方便)。

// 软删除数据 使用delete_time字段标记删除
Db::name('user')
 ->where('id', 1)
 ->useSoftDelete('delete_time',time())
  ->delete();

实际生成的SQL语句可能如下(执行的是UPDATE操作):

UPDATE `think_user` SET `delete_time` = '1515745214' WHERE `id` = 1

useSoftDelete方法表示使用软删除,并且指定软删除字段为delete_time,写入数据为当前的时间戳。

tp5.1--数据库更新操作

更新数据

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

实际生成的SQL语句可能是:

UPDATE `think_user` SET `name`='thinkphp' WHERE `id` = 1

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

支持使用data方法传入要更新的数据

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

如果update方法和data方法同时传入更新数据,则会进行合并。

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

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

实际生成的SQL语句和前面用法是一样的:

UPDATE `think_user` SET `name`='thinkphp' WHERE `id` = 1

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

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

实际生成的SQL语句:

UPDATE 
  `think_user` 
SET 
  `read_time` = `read_time` + 1 , 
  `score` = `score` - 3 , 
  `name` = UPPER(name) 
WHERE 
  `id` = 1

V5.1.7+版本以后,支持使用raw方法进行数据更新,适合在数组更新的情况。

Db::name('user')
  ->where('id', 1)
  ->update([
    'name' => Db::raw('UPPER(name)'),
    'score' => Db::raw('score-3'),
    'read_time' => Db::raw('read_time+1')
  ]);

更新字段值

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

最终生成的SQL语句可能如下:

UPDATE `think_user` SET `name` = 'thinkphp' WHERE `id` = 1

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

最终生成的SQL语句可能是:

UPDATE `think_user` SET `score` = `score` + 1 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` + 5 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` - 1 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` - 5 WHERE `id` = 1

setInc/setDec支持延时更新,如果需要延时更新则传入第三个参数,下例中延时10秒更新。

Db::name('user')->where('id', 1)->setInc('score', 1, 10);

setInc/setDec 方法返回影响数据的条数,如果使用了延迟更新的话,可能会返回true

tp5.1--数据库查询操作

selectOrFail();//在没有查找到数据后抛出异常

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

findOrFail();//在没有查找到数据后抛出异常

Db::table('think_user')->where('id',1)->findOrFail();

findOrEmpty();//当查询不存在时,返回空数组

Db::table('think_user')->where('id',1)->findOrEmpty();

查询某个字段的值,结果不存在时,返回null

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

查询某一列的值

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

返回完整数据,并且添加一个索引值,查询结果不存在,返回空数组

// 指定id字段的值作为索引 返回所有数据
Db::table('think_user')->where('status',1)->column('*','id');

返回某一条数据的一个字段值

Db::name('user')->where(['id' => 1])->value('name');

数据分批处理

全部用户表数据进行分批处理,每次处理 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) {
  foreach ($users as $user) {
    // 处理结果集...
 if($user->status==0){
      return false;
    }
  }
});

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

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

chunk方法的处理默认是根据主键查询,支持指定字段,例如:

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

并且支持指定处理数据的顺序。

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

chunk方法一般用于命令行操作批处理数据库的数据,不适合WEB访问处理大量数据,很容易导致超时。

大批量数据处理

如果需要处理大量的数据,可以使用新版提供的游标查询功能,该查询方式利用了PHP的生成器特性,可以大幅减少大量数据查询的内存占用问题。

$cursor = Db::table('user')->where('status', 1)->cursor();
foreach($cursor as $user){
 echo $user['name'];
}

cursor方法返回的是一个生成器对象,user变量是数据表的一条数据(数组)。

JSON类型数据查询(mysql)

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

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
收集的DedeCMS一些使用经验
Mar 17 PHP
fleaphp rolesNameField bug解决方法
Apr 23 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
深入php多态的实现详解
Jun 09 PHP
PHP base64编码后解码乱码的解决办法
Jun 19 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
php的扩展写法总结
May 14 PHP
PHP基于ip2long实现IP转换整形
Dec 11 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 #PHP
tp5.1 框架查询表达式用法详解
May 25 #PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 #PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 #PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 #PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 25 #PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 #PHP
You might like
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
PHP使用函数用法详解
2018/09/30 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
理解javascript正则表达式
2016/03/08 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
Python制作简单的网页爬虫
2015/11/22 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
白酒市场营销方案
2014/02/25 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers