增删改查的操作
学习一下数据库 Db 类的查询语句,包含 table、name 以及助手函数 db。学习来源于李炎恢TP5讲义
一. 新增数据
使用
insert()
方法可以向数据表添加一条数据;$data = [ 'username' => '辉夜', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => '123', 'create_time' => date('Y-m-d H:i:s') ]; Db::name('user')->insert($data);
如果新增成功,
insert()
方法会返回一个 1 值$flag = Db::name('user')->insert($data); if ($flag) return '新增成功!';
你可以使用
data()
方法来设置添加的数据数组;Db::name('user')->data($data)->insert();
- 如果你添加一个不存在的数据,会抛出一个异常 Exception;
如果采用的是 mysql 数据库,支持
REPLACE 写入
;Db::name('user')->insert($data, true);
使用
insertGetId()
方法,可以在新增成功后返回当前数据 ID;Db::name('user')->insertGetId($data);
使用
insertAll()
方法,可以批量新增数据,但要保持数组结构一致$data = [ [ 'username' => '辉夜 1', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => 123, 'create_time' => date('Y-m-d H:i:s') ], [ 'username' => '辉夜 2', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => 123, 'create_time' => date('Y-m-d H:i:s') ], ]; Db::name('user')->insertAll($data);
批量新增也支持 data()方法,和单独新增类似;
Db::name('user')->data($data)->insertAll()
批量新增也支持 reaplce 写入,和单独新增类似;
Db::name('user')->insertAll($data, true);
二. 修改数据
使用
update()
方法来修改数据,修改成功返回影响行数,没有修改返回0$data = [ 'username' => '李白' ]; $update = Db::name('user')->where('id', 38)->update($data); return $update;
或者使用
data()
方法传入要修改的数组,如果两边都传入会合并;Db::name('user')->where('id', 38)->data($data)->update(['password'=>'456']);
如果修改数组中包含主键,那么可以直接修改;(不需要写where()链式 )
$data = [ 'username' => '李白', 'id' => 38 ]; Db::name('user')->update($data);
使用
inc()
方法可以对字段增值,dec()
方法可以对字段减值;Db::name('user')->inc('price',3)->update($data); //price+3块, Db::name('user')->dec('price', 3)->update($data); //price减3块
增值和减值如果同时对一个字段操作,前面一个会失效;
Db::name('user')->inc('price')->dec('price', 3)->update($data); //只把price减3
使用
exp()
方法可以在字段中使用 mysql 函数;Db::name('user')->exp('email', 'UPPER(email)')->update($data); //邮箱转大写
使用
raw()
方法修改更新,更加容易方便$data = [ 'username' => '李白', 'email' => Db::raw('UPPER(email)'), 'price' => Db::raw('price - 3'), 'id' => 38 ]; Db::name('user')->update($data);
使用
setField()
方法可以更新一个字段值;Db::name('user')->where('id', 38)->setField('username', '辉夜');
增值
setInc()
和减值setDec()
也有简单的做法,方便更新一个字段值Db::name('user')->where('id', 38)->setInc('price');
- 增值和减值如果不指定第二个参数,则步长默认为 1;
三. 删除数据
极简删除
delete()
可以根据主键直接删除,删除成功返回影响行数,否则 0;Db::name('user')->delete(51);
根据主键,还可以删除多条记录;
Db::name('user')->delete([48,49,50]);
正常情况下,通过
where()
方法来删除;Db::name('user')->where('id', 47)->delete();
通过 true 参数删除数据表所有数据,我还没测试,大家自行测试下;
Db::name('user')->delete(true);
四. 查询数据
- Db::table() 中 table 必须指定完整数据表(包括前缀);
如果希望只查询一条数据,可以使用
find()
方法;Db::table('tp_user')->find();
Db::getLastSql()
方法,可以得到最近一条 SQL 查询的原生语句;SELECT * FROM `tp_user` LIMIT 1
想指定数据查询,可以使用
where()
方法; 没有查询到任何值,则返回 null;Db::table('tp_user')->where('id', 27)->find() //SELECT * FROM `tp_user` WHERE `id` = 27 LIMIT 1
使用
findOrFail()
方法同样可以查询一条数据,在没有数据时抛出一个异常;Db::table('tp_user')->where('id', 1)->findOrFail()
使用
findOrEmpty()
方法也可以查询一条数据,但在没有数据时返回一个空数组;Db::table('tp_user')->where('id', 1)->findOrEmpty();
想要获取多列数据,可以使用
select()
方法;Db::table('tp_user')->select(); //SELECT * FROM `tp_user`
多列数据在查询不到任何数据时返回空数组,使用
selectOrFail()
抛出异常;Db::table('tp_user')->where('id', 1)->selectOrFail();
当在数据库配置文件中设置了前缀,那么我们可以使用
name()
方法忽略前缀;Db::name('user')->selectOrFail();
五. 更多方法
ThinkPHP 提供了一个助手函数 db,可以更方便的查询;
\db('user')->select();
通过
value()
方法,可以查询指定字段的值(单个),没有数据返回 null;Db::name('user')->where('id', 27)->value('username');
通过
colunm()
方法,可以查询指定列的值(多个),没有数据返回空数组;Db::name('user')->column('username'); //返回多行数据
colunm()
方法 ,可以指定 id 作为列值的索引;
Db::name('user')->column('username', 'id'); // array( array(1=>'小明') , array(2=>'小强'))
- 数据分批处理、大批数据处理和 JSON 数据查询,当遇到具体问题再探讨;
评论 (0)