You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter 3分类页商品按doping类型及日期排序需求问询

商品分类页Doping排序与显示解决方案

需求说明

  • 排序优先级(从高到低):
    1. 同时包含doping类型1和4的商品:按创建日期降序排列在顶部
    2. 仅包含doping类型1的商品
    3. 仅包含doping类型4的商品
    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; ?>

核心逻辑说明

  1. 左连接doping表:确保无doping的商品也能被查询到
  2. 自定义排序权重:通过CASE语句生成sort_weight字段,实现需求的排序优先级
  3. 聚合doping信息:用GROUP_CONCAT把商品关联的所有doping类型、名称合并成字符串,方便视图直接展示
  4. 双规则排序:先按权重降序,再按最新doping创建日期降序,满足顶部商品的排序要求

内容的提问来源于stack exchange,提问作者Codeigniter Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:18:31