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

Yii2中创建自定义列实现销售记录的条件筛选

解决方案

步骤1:在模型中添加虚拟属性

在你的销售线条目模型(比如SalesLine.php)里添加一个用于筛选的虚拟属性:

public $recordType;

同时在模型的验证规则中添加该属性的安全验证(确保能接收筛选参数):

public function rules()
{
    return [
        // 保留原有其他规则
        [['recordType'], 'safe'],
    ];
}

步骤2:在搜索模型中添加筛选逻辑

在对应的搜索模型(比如SalesLineSearch.php)的search()方法里,根据recordType的值添加查询过滤条件:

public function search($params)
{
    $query = SalesLine::find();

    // 保留原有分页、排序设置
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'pagination' => ['pageSize' => 20],
        'sort' => ['defaultOrder' => ['id' => SORT_DESC]],
    ]);

    $this->load($params);

    // 保留原有其他过滤规则

    // 根据recordType筛选对应类型的记录
    if ($this->recordType === 'Service') {
        $query->andWhere(['not', ['service_id' => null]]);
    } elseif ($this->recordType === 'Promo') {
        $query->andWhere(['not', ['promo_id' => null]]);
    } elseif ($this->recordType === 'Item') {
        $query->andWhere(['not', ['item_id' => null]]);
    }

    return $dataProvider;
}

步骤3:在GridView中添加自定义筛选列

在GridView的columns配置里添加这个自定义列,实现下拉筛选和类型显示:

[
    'attribute' => 'recordType',
    'label' => '记录类型',
    // 下拉筛选选项
    'filter' => [
        'Service' => '服务',
        'Promo' => '促销',
        'Item' => '商品'
    ],
    // 显示每条记录对应的类型
    'value' => function ($model) {
        if (!empty($model->service_id)) {
            return '服务';
        } elseif (!empty($model->promo_id)) {
            return '促销';
        } elseif (!empty($model->item_id)) {
            return '商品';
        }
        return '未知';
    },
],

进阶优化:支持排序的写法

如果需要让这个自定义列支持排序,可以在查询中直接通过SQL生成recordType字段,替代PHP判断:
在搜索模型的search()方法里,修改查询的select语句:

$query->select([
    '*',
    'recordType' => new \yii\db\Expression("
        CASE
            WHEN service_id IS NOT NULL THEN 'Service'
            WHEN promo_id IS NOT NULL THEN 'Promo'
            WHEN item_id IS NOT NULL THEN 'Item'
            ELSE 'Unknown'
        END
    ")
]);

此时GridView列的value可以简化为:

'value' => 'recordType',

同时要在模型的attributes()方法中声明该字段,确保排序识别:

public function attributes()
{
    return array_merge(parent::attributes(), ['recordType']);
}

内容的提问来源于stack exchange,提问作者luigi lopez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:14:58