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
相关产品推荐
相关产品推荐

