thinkphp笔记-数据库新增、修改、删除
新增
单条数据新增
如果要向数据表中插入一条数据
use think\facade\Db;
$data = [
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => 'huiye@163.com',
'price' => 90,
'details' => '123'
];
// 新增成功,会返回一个影响行数:1
return Db::name('user')->insert($data);
如果你添加一个不存在的字段数据,会抛出一个异常Exception;如果想强行新增并抛弃不存在的字段数据,则使用strick(false)方法,忽略异常;
$data = [
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => 'huiye@163.com',
'price' => 90,
'details' => '123',
'abc' => 'def' // 这个abc属性数据表中不存在
];
// 新增成功,会返回一个影响行数
return Db::name('user')->strict(false)->insert($data);
链式添加->strict(false),那么就会忽略不存在的属性,并添加成功,返回一个1。
如果我们采用的数据库是mysql,可以支持replace 写入;insert 和replace 写入的区别,前者表示表中存在主键相同则报错,后者则修改。
Db::name('user')->replace()->insert($data);
return Db::getLastSql();
REPLACE INTO `tp_user` SET `username` = '辉夜' , `password` = '123' , `gender` = '女' , `email` = 'huiye@163.com' , `price` = '90' , `details` = '123'
使用insertGetId()方法,可以在新增成功后返回当前数据ID;
return Db::name('user')->insertGetId($data); // 返回新增的Id 306
批量新增
使用insertAll()方法,可以批量新增数据,但要保持数组结构一致;
$dataAll = [
[
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => 'huiye@163.com',
'price' => 90,
'details' => '123'
],
[
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => 'huiye@163.com',
'price' => 90,
'details' => '123'
]
];
// 返回影响的行数:2
return Db::name('user')->insertAll($dataAll);
批量新增也支持replace()方法,添加后改变成replace into;
Db::name('user')->replace()->insertAll($dataAll);
通用的save方法
save()方法是一个通用方法,可以自行判断是新增还是修改(更新)数据
save()方法判断是否为新增或修改的依据为,是否存在主键,不存在即新增;
return Db::name('user')->save($data); // 成功返回1,因为没有id,所以是插入
如果给数据赋予id属性:
$data = [
'id' => 312,
'username' => '嗷嗷',
'password' => '123',
'gender' => '女',
'email' => 'huiye@163.com',
'price' => 90,
'details' => '123'
];
return Db::name('user')->save($data);
// 此时也会返回1,但是打开数据表发现id=312项名称换了,证明更新成功
修改
使用update()方法来修改数据,修改成功返回影响行数,没有修改返回0;(所谓没有修改的意思就是修改的内容与原内容是一致的,那么就会返回0,虽简单的测试就是update执行之后再刷新一次即可看到返回的就是0)
use think\facade\Db;
$data = [
'username' => '礼拜'
];
return Db::name('user')->where('id', '=', '312')->update($data); // 成功返回1(1行受影响)
如果修改数据包含了主键信息,比如id,那么可以省略掉where 条件;
$data = [
'id' => 311,
'username' => '李逵'
];
return Db::name('user')->update($data);
如果想让一些字段修改时执行SQL 函数操作,可以使用exp()方法实现;
// 将id=312的行中的email执行SQL函数操作,变大写,然后更新,成功返回1
return Db::name('user')->where('id', '=', '312')
->exp('email', 'UPPER(email)') // 变大写后再赋值给email字段
->update();
如果要自增/自减某个字段,可以使用inc/dec 方法,并支持自定义步长;
return Db::name('user')->where('id', '=', '312')
->inc('price') // 默认步长就是1,即每次刷新+1
->dec('status', 2) // 传递参数,设定步长-2,每次刷新-2
->update(); // 更新成功 返回受影响的行数1
}
一个更加简单粗暴灵活的方式,使用::raw()方法实现上面两点的内容,且可读性更好;
return Db::name('user')->where('id', '=', '308')
->update([
'email' => Db::raw('UPPER(email)'),
'price' => Db::raw('price + 1'),
'status' => Db::raw('status - 2')
]);
}
使用save()方法进行修改数据,这里必须指定主键才能实现修改功能;
return Db::name('user')->where('id', '308')
->save([
'username' => '白居易'
]);
}
删除
极简删除可以根据主键直接删除,删除成功返回影响行数,否则0;
return Db::name('user')->delete(310); // 成功 返回1 受影响行数是1
根据主键,还可以删除多条记录;
return Db::name('user')->delete([303, 304, 305]); // 成功 返回受影响行数3
正常情况下,通过where()方法来删除;(上面两种方式可读性较差)
return Db::name('user')->where('id', 302)->delete();
通过true 参数删除数据表所有数据:
Db::name('user')->delete(true);