CodeIgniter 3分类页商品按doping类型及日期排序需求问询
商品分类页Doping排序与显示解决方案
需求说明
- 排序优先级(从高到低):
- 同时包含doping类型1和4的商品:按创建日期降序排列在顶部
- 仅包含doping类型1的商品
- 仅包含doping类型4的商品
- 无任何doping的普通商品
- 视图需调用商品关联的doping类型,显示对应的doping名称
现有代码局限
你当前的getdopingoneandfor方法仅查询了包含doping1或4的商品,无法区分「同时有1和4」「仅1」「仅4」的场景,也未覆盖无doping的普通商品,且未返回doping类型/名称信息用于视图展示。
优化后的Model查询方法
以下是满足完整需求的CodeIgniter 3查询实现:
public function getProductsByCategoryWithDopingSort($category_id) { $this->db->select(' products.*, products.id as product_id, products_details.price as product_price, GROUP_CONCAT(DISTINCT dopings.type SEPARATOR ",") as doping_types, GROUP_CONCAT(DISTINCT dopings.name SEPARATOR ",") as doping_names, CASE WHEN SUM(CASE WHEN dopings.type = 1 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN dopings.type = 4 THEN 1 ELSE 0 END) > 0 THEN 4 WHEN SUM(CASE WHEN dopings.type = 1 THEN 1 ELSE 0 END) > 0 THEN 3 WHEN SUM(CASE WHEN dopings.type = 4 THEN 1 ELSE 0 END) > 0 THEN 2 ELSE 1 END as sort_weight, MAX(dopings.created_at) as latest_doping_created '); $this->db->from('products'); $this->db->join('products_details', 'products_details.product_id = products.id', 'left'); $this->db->join('dopings', 'dopings.product_id = products.id AND dopings.end_date >= CURDATE()', 'left'); $this->db->where('products.status', 1); $this->db->where('products.category_id', $category_id); $this->db->group_by('products.id'); $this->db->order_by('sort_weight', 'DESC'); $this->db->order_by('latest_doping_created', 'DESC'); $query = $this->db->get(); return $query->result(); }
视图中显示Doping名称
在视图循环商品数据时,直接读取聚合后的doping_names字段即可:
<?php foreach ($products as $product): ?> <div class="product-card"> <h4><?= $product->name ?></h4> <p>售价:<?= $product->product_price ?></p> <p class="doping-tag"> <?php if (!empty($product->doping_names)): ?> 关联权益:<?= $product->doping_names ?> <?php else: ?> 普通商品 <?php endif; ?> </p> </div> <?php endforeach; ?>
核心逻辑说明
- 左连接doping表:确保无doping的商品也能被查询到
- 自定义排序权重:通过
CASE语句生成sort_weight字段,实现需求的排序优先级 - 聚合doping信息:用
GROUP_CONCAT把商品关联的所有doping类型、名称合并成字符串,方便视图直接展示 - 双规则排序:先按权重降序,再按最新doping创建日期降序,满足顶部商品的排序要求
内容的提问来源于stack exchange,提问作者Codeigniter Developer
相关产品推荐
相关产品推荐

