惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
博客园_首页
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
美团技术团队
D
Docker
WordPress大学
WordPress大学
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
Y
Y Combinator Blog
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
G
Google Developers Blog
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
MongoDB | Blog
MongoDB | Blog
S
SegmentFault 最新的问题
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans

遐说

2026第一场日出日落-黄山 [徒步]宁波九龙爱心线 [徒步]仙居公盂徒步+丽人谷溯溪(多图) 文献引用批量标注蓝色-Zotero/EndNote [出差]内蒙草原风光 [徒步]浙东小九寨 [徒步]西湖小猫线 微软Office365家庭版拼车5年180 2024浏阳跨年烟火 一路向北-广西 落日余晖——武汉东湖 博士论文盲审通过 青海出差 我开盒了我自己 hexo-butterfly+artalk无法显示文章PV浏览次数 记某站字体混淆解析方案 记第一次进藏 2024川西大环线 Python读取NetCDF文件-裁剪&计算 2024武汉东湖樱花园 zotero批量修改条目语言解决”等”和”et al”混排问题 torch_geometric_temporal安装报错找不到to_dense_adj 武汉冻雨&乡村春节 云南镇雄县凉水村滑坡:卫星影像解析 博客聚合平台RSS订阅-BlogFinder&博友圈&十年之约 腾讯云CDN正式取消免费10G流量包 2023跨年闲逛武汉 观感|小米SU7技术发布会 【留痕】解密微信聊天记录工具:年度报告、聊天导出一键搞定! 小米电脑管家 vs. MIUI+: 手机与PC协同体验大比拼!
CI框架常用数据库操作技巧
Dorad · 2018-01-28 · via 遐说

发表于|更新于|编程PHP

|总字数:980|阅读时长:4分钟|浏览量:|

¶前言

近期在CI框架下开发了多个项目(准确说是接盘哈哈),在增改删查中也学习了不少的小技能~
留下以后备查~

¶数据库

增改删查作为最基本的数据库操作,写起来代码冗余。等我琢磨一下看能不能封装一层 Model ,减去这些冗余的操作。

¶查询分页

在对大量数据进行查询时,经常要用到分页查询操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public function get($param1 = null, $param2 = null, $param3 = null, $order_by = null, $direction = 'DESC', $page_size = 30, $page_index = 1){

$table_name='database_table_1';



if ($param1) {
$this->db->where('param1', $param1);
}
if ($param2) {
$this->db->where('param2', $param2);
}
if ($param3) {
$this->db->like('param3', $param3);
}

if ($order_by) {
if (!$this->db->field_exists($order_by,$table_name)) {

$this->msg = '该筛选字段不存在';
$this->code = 10022;
return false;
} else {
$this->db->order_by($order_by, $direction == null ? 'DESC' : $direction);
}
}

$result_nums = $this->db->count_all_results($table_name,false);
$page_size = intval($page_size);

$page_index = intval($page_index);
$limit = 0;
$offset = 30;
if ($page_index >= 1) {
$offset = ($page_index - 1) * $page_size;
$limit = $page_size;
}
$this->db->limit($limit, $offset);
$query = $this->db->get();
$result = $query->result_array();

$result_new = array();
if ($result) {
$this->msg = '查到相关记录';
$this->code = 0;
$result_new['page_index'] = $page_index;
$result_new['page_size'] = $page_size;
$result_new['count'] = $result_nums;
$result_new['records'] = $result;
} else {
$this->msg = '未查到相关记录!';
$this->code = 10023;
return false;
}
return $result_new;
}

只需要稍微修改 $table_name 以及相关参数,就能完成筛选、排序和分页等操作。

¶批量更新

当有大部分数据需要进行同步时,考虑到效率问题以及相关的操作复杂度。最初我用的自己构造的sql语句进行操作,但效率很低,而且很繁琐。原sql语句:

1
SET name= CASE mobile WHEN '16688889999' THEN '小明' WHEN '19966665555' THEN '小红'...END

但是效率低、构造困难。后发现 CI 自带批量更新。官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

$data=array(
array(
'name'='小明',
'mobile'='16688889999',
'department'=>'信息部'
),
array(
'name'='小红',
'mobile'='19966665555',
'department'=>'体育部'
),
array(
'name'='小张',
'mobile'='16536556986',
'department'=>'科技部'
)
);

$re=$this->db->update_batch('database_table_1',$data,'mobile');

¶分组统计

当需要统计分析每小时/每天/每月/每年的记录时,时常会用到分组统计的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* 24h内,按小时统计 */
$this->db->select('DATE_FORMAT(s.insert_datetime,\'%Y-%m-%d\') as date,HOUR(s.insert_datetime) as hour,s.status,count(1) as total');
$this->db->where('TIMESTAMPDIFF(HOUR,DATE_FORMAT(s.insert_datetime,\'%Y-%m-%d %H:%m:%s\'),CURTIME())<=24');
$this->db->group_by('s.status,DATE_FORMAT(s.insert_datetime,\'%Y-%m-%d %H\')');
$this->db->order_by('date','ASC');
$result=$this->db->get()
->result_array();
/*
* 结果后处理,显示 count 为0
*/
$datetime_now = new DateTime();
$datetime_old = new DateTime();
date_sub($datetime_old, date_interval_create_from_date_string("23 hours"));
for (; $datetime_old->getTimestamp() <= $datetime_now->getTimestamp(); date_add($datetime_old, date_interval_create_from_date_string("1 hours"))) {
$status = array('发送成功', '发送失败');
foreach ($status as $s) {
# 筛选是否存在
$flag = 0;
if ($result) {
foreach ($result as $key => $row) {
if ($row['date'] == $datetime_old->format('Y-m-d') AND $row['hour'] == $datetime_old->format('H') AND $row['status'] == $s) {
$flag = 1;
}
}
}
//若不存在,则插入
if (!$flag) {
array_push($result, array(
'date' => $datetime_old->format('Y-m-d'),
'hour' => strval(intval($datetime_old->format('H'))),
'status' => $s,
'total' => 0
));
}
}
}
$result = arraySequence($result, 'date', 'SORT_ASC');

¶总结

都是一些经常用到的东西,记录一下,以后备查~

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 遐说

请喝果茶

  • Wechat

    Wechat

  • Alipay

    Alipay