
本文介绍如何在 codeigniter 项目中将混合数据(如 deal 和 coupon)按类型分离,分别渲染为两个独立表格,避免视图层处理逻辑,遵循 mvc 分离原则,提升可维护性与性能。
在实际开发中,将不同业务类型的数据(如 deal_type == 0 表示 Deal,deal_type == 1 表示 Coupon)混在一个循环中渲染,不仅可读性差,也违背了“视图只负责展示”的设计准则。理想做法是:在控制器中完成数据预处理与分组,再将结构化数据传递给视图。
✅ 推荐实现流程
1. 控制器层:分组并预加载关联数据
在控制器中,从模型获取原始结果后,主动按 deal_type 分组,并提前调用 get_likes() 等辅助函数,避免在视图中重复执行数据库/逻辑操作:
// 示例控制器代码(如 Admin_controller.php)
public function index() {
$result = $this->your_model->get_all_coupons_and_deals(); // 假设返回对象数组
$groups = [
'Deals' => [],
'Coupons' => []
];
foreach ($result as $row) {
$type = ($row->deal_type == 0) ? 'Deals' : 'Coupons';
// 预取 likes 数量,避免视图中调用函数
$likes = get_likes($row->id);
$likeCount = isset($likes[0]->likes) ? (int)$likes[0]->likes : 0;
$groups[$type][] = (object)[
'title' => $row->deal_title,
'created_at' => $row->created_at,
'user_likes' => $likeCount,
'status' => $row->deal_status
];
}
$this->load->view('admin/coupons_deals_list', ['groups' => $groups]);
}⚠️ 注意:get_likes() 若涉及数据库查询,请确保已做缓存或批量优化;若该函数未适配批量查询,建议重构为 get_likes_batch($ids) 提升效率。
2. 视图层:简洁、安全地渲染分组表格
视图不再包含条件判断和数据处理逻辑,仅专注 HTML 结构。使用 printf() 模板化输出,提高可读性与安全性(自动转义需配合 CI 的 esc() 辅助函数,此处为简化示例,生产环境建议对 title 等字段做 html_escape() 处理):
%d
%s
%s
%s
%s
%s
HTML;
foreach ($groups as $groupName => $groupRows) {
if (empty($groupRows)) continue; // 跳过空分组
echo '' . htmlspecialchars($groupName) . '
';
echo '| # | Title | Type | Date | Likes | Status |
|---|
'; } ?>
✅ 优势总结
- 职责清晰:控制器负责数据组织,视图专注呈现;
- 性能更优:get_likes() 等操作只执行一次/每行一次,而非在视图中反复调用;
- 易于扩展:新增类型(如 “Flash Sale”)只需修改分组键名,无需改动视图逻辑;
- 便于测试:分组逻辑可单元测试,视图可独立进行 UI 测试;
-
SEO 与可访问性更友好:语义化
+ 独立
更利于屏幕阅读器与搜索引擎解析。
通过这种结构化方式,你不仅能优雅解决“显示两类数据”的需求,也为后续功能迭代(如分页、筛选、导出)打下坚实基础。










