环境配置:
PHP 7.3.4 + mysql 5.6 + ThinkPHP 6.1
目录
环境配置:
1.连接数据表
2.查看执行sql
3.查询单条数据
4.查询数据集
5.设置返回字段 field
6.排序order
7.列查询
8.值查询
9.新增单条数据
10.新增批量数据
11.更新数据
12.Raw更新
13.自增/自减
15.删除数据
16.删除全部数据
name方式
用处:简化数据表前缀的传入,例如:
Db::name('inquiry');
会自动获取当前模型对应的数据表前缀来生成 inquiry 数据表名称。
注意:本文章的数据表没有前缀,有前缀的就会自动获取 前缀_inquiry数据表
table方式
用法:
切换操作的数据表;
table方法指定的数据表需要完整的表名
Db::table('inquiry');
指定数据库:
Db::table('db_name.inquiry');
对多表进行操作;
Db::table('inquiry i,inquiry_company c')
->field('i.id,c.iq_id')
->limit(10)->select();
注意:多表查询,并非联合查询
Sql:
SELECT `i`.`id`,`c`.`iq_id` FROM `inquiry` `i`,`inquiry_company` `c` LIMIT 10
echo Db::table('inquiry')->fetchSql(true)->find(1);
Db::name('inquiry')->where('brand', 10)->where('category', 42)->find()
Sql:
SELECT * FROM `inquiry` WHERE `brand` = 10 AND `category` = 42 LIMIT 1
返回结果:
Array
(
[id] => 1
[uid] => 11
[company_id] => 5
[content] => 690164-B21 P220I raid卡 数量1
[fileurl] =>
[brand] => 10
[category] => 42
[num] => 1
[signup_num] => 0
[arrival_time] => 1614096000
[addtime] => 1614145474
[invoice_type] =>
[appoint_company] =>
[is_expire] => 1
)
Db::name('inquiry')->where('brand', 10)->where('category', 42)->select()->toArray();
需要toArray()方法把返回数据对象转化为数组。
Sql:
SELECT * FROM `inquiry` WHERE `brand` = 10 AND `category` = 42
返回结果:
Array
(
[0] => Array
(
[id] => 1
[uid] => 11
[company_id] => 5
[content] => 690164-B21 P220I raid卡 数量1
[fileurl] =>
[brand] => 10
[category] => 42
[num] => 1
[signup_num] => 0
[arrival_time] => 1614096000
[addtime] => 1614145474
[invoice_type] =>
[appoint_company] =>
[is_expire] => 1
)
[1] => Array
(
[id] => 149
[uid] => 10
[company_id] => 4
[content] => 615732-B21 HP Ethernet 1Gb 2-port 332T 网卡
[fileurl] =>
[brand] => 10
[category] => 42
[num] => 5
[signup_num] => 0
[arrival_time] => 1616515200
[addtime] => 1616562900
[invoice_type] =>
[appoint_company] =>
[is_expire] => 1
)
)
一般我们在项目中查询时,不会直接获取所有字段,都是按需获取指定部分字段,这也是一种数据查询优化方式。而TP中获取部分字段,并不是直接在find([‘id’, ‘brand’, ‘category’]) 或者 select([‘id’, ‘brand’, ‘category’]) 这样做了,只会得到NULL 或者 array(),需要一个新的方法:
Db::name('inquiry')->field(['id', 'brand', 'category'])->find();
Db::name('inquiry')->field(['id', 'brand', 'category'])->select()->toArray();
Db::name('inquiry')
->field(['id', 'brand', 'category'])
->order('id','desc')->find();
Db::name('inquiry')
->field(['id','brand','category'])
->order('id','desc')
->select()->toArray();
查询某一列的值可以用.
Db::name('app_service')->where('id', '>', 1)->column('name');
返回结果:
Array
(
[0] => 新增数据
[1] => 新增数据
[2] => 新增数据
[3] => 新增数据
[4] => 新增数据
[5] => 新增数据
[6] => 新增数据
[7] => 新增数据
[8] => 新增数据
)
Id作key
Db::name('app_service')->where('id', '>', 1)->column('name', 'id');
返回结果:
Array
(
[2] => 新增数据
[3] => 新增数据
[4] => 新增数据
[5] => 新增数据
[6] => 新增数据
[7] => 新增数据
[8] => 新增数据
[9] => 新增数据
[10] => 新增数据
)
查询某个字段的值可以用。
Db::name('app_service')->where('id', 1)->value('name');
返回结果:
新增数据
save
自动判断是新增还是更新数据(以写入数据中是否存在主键数据为依据)。
Db::name('app_service')->save([
'name' => '新增数据',
'state' => 1,
'reason' => '测试新增数据',
'addtime' =>time(),
]);
insert
Db::name('app_service')->insert([
'name' => '新增数据',
'state' => 1,
'reason' => '测试新增数据',
'addtime' =>time(),
]);
Sql:
INSERT INTO `app_service` SET `name` = '新增数据' , `state` = 1 , `reason` = '测试新增数据' , `addtime` = 1673242525
返回结果:
成功:返回添加成功的条数;失败:抛出异常
insertGetId
Db::name('app_service')->insertGetId([
'name' => '新增数据',
'state' => 1,
'reason' => '测试新增数据',
'addtime' =>time(),
]);
Sql:同save、insert
返回结果:
返回新增数据的自增主键
确保字段一致
$data = [
[
'name' => '新增数据-批量1',
'state' => 1,
'reason' => '测试新增数据',
'addtime' =>time(),
],
[
'name' => '新增数据-批量2',
'state' => 1,
'reason' => '测试新增数据',
'addtime' =>time(),
]
];
$info1 = Db::name('app_service')->fetchSql(true)->insertAll($data);
Sql:
INSERT INTO `app_service` (`name` , `state` , `reason` , `addtime`) VALUES ( '新增数据-批量1',1,'测试新增数据',1673242931 ) , ( '新增数据-批量2',1,'测试新增数据',1673242931 )
返回结果:
是2,为成功添加条数;错误,则抛出异常。
save
根据自增id,去识别更新
Db::name('app_service')->save(['id' => 18, 'name' => '编辑数据-测试']);
update
Db::name('app_service')->where('id', 18)->update(['name' => '编辑数据-测试']);
Sql:
UPDATE `app_service` SET `name` = '编辑数据-测试3' WHERE `id` = 18
返回结果:
返回修改影响条数
Db::name('app_service')
->where('id', 18)
->update([
'name' => '数据raw操作',
'state' => Db::raw('state-1'),
'addtime' => Db::raw('addtime+3')
]);
Sql:
UPDATE `app_service` SET `name` = '数据raw操作' , `state` = state-1 , `addtime` = addtime+3 WHERE `id` = 18
可以使用inc/dec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)。
自增
Db::name('app_service')->where('id', 18)->inc('name', 1)->update();
Db::name('app_service')->where('id', 18)->inc('addtime')->update();
自减
Db::name('app_service')->where('id', 18)->dec('addtime', 1)->update();
Db::name('app_service')->where('id', 18)->dec('addtime')->update();
注意:当要操作的字段值为NULL时,自增/自减不执行。
条件删除
Db::name('app_service')->where('id',18)->delete();
Db::name('app_service')->where('id','>',15)->delete();
返回结果:
删除条数
Db::name('app_service')->delete(true);
需要设置为true,否则抛出“没有条件不会执行删除操作”提示