如何用单个函数替换模型中多个相似的查询函数?
合并重复数据库查询函数的解决方案
你可以通过将表名作为参数传入单个函数的方式,替换掉这些重复的函数,同时优化查询逻辑提升性能,具体实现如下:
优化后的单个函数
public function countSurat($tableName) { // 表名白名单验证,防止SQL注入风险 $allowedTables = ['ts_300', 'ts_336_a', 'ts_336_b', 'ts_336_c']; if (!in_array($tableName, $allowedTables)) { return 0; // 也可根据业务需求抛出异常 } // 使用COUNT(*)直接统计行数,比SELECT *再num_rows()更高效 $query = $this->db->query("SELECT COUNT(*) FROM `{$tableName}` WHERE `status_surat` = '1'"); return $query->row()->{'COUNT(*)'} ?? 0; }
调用方式
原来的函数调用可以直接替换为:
- 替代
Surat_300():$this->countSurat('ts_300') - 替代
Surat_336_a():$this->countSurat('ts_336_a') - 其他函数以此类推,传入对应的表名即可
优化亮点
- 消除代码冗余:把重复的查询逻辑统一到一个函数中,后续新增类似需求只需添加白名单表名即可
- 提升查询效率:直接用
COUNT(*)让数据库完成统计,避免查询所有数据再计算行数的资源浪费 - 增强安全性:通过白名单限制允许访问的表,避免传入恶意表名引发SQL注入攻击
内容的提问来源于stack exchange,提问作者laode fauzan
相关产品推荐
相关产品推荐

