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 相关文章推荐
第七节 类的静态成员 [7]
Oct 09 PHP
php学习 字符串课件
Jun 15 PHP
php 静态变量与自定义常量的使用方法
Jan 26 PHP
PHP中遍历stdclass object的实现代码
Jun 09 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
php上传文件问题汇总
Jan 30 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
浅析PHP7的多进程及实例源码
Apr 14 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的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
用js做一个小游戏平台 (一)
2009/12/29 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
python和bash统计CPU利用率的方法
2015/07/10 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python 基础知识之字符串处理
2017/01/06 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
教育科研先进个人材料
2014/01/26 职场文书
学习决心书
2014/03/11 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python