在某些场合下,表格数据来自于多个没有直接关联关系的表格,并且需要经过合并,分解以及更多复杂的处理。
通常是做统计报告的时候需要这样处理,这时,CGridView支持的CActiveRecordProvider就不够用了(当然也可以通过生成中间表来处理)。
Yii中提供了另外一种更加灵活的方式来使用CGridView,即通过数组数据来提供数据源。
具体方法是首先构造出数组数据,然后转换为framework/web/CArrayDataProvider对象,然后传递给CGridView的dataProvider属性。
1、控制器中:
$deals = Yii::app()->db->createCommand('select id, `phone`, count(`id`) as count from '.Deal::tableName()." WHERE `phone` = $keyword AND `status`=1 GROUP BY `phone`;")->queryAll(); $vendors = Yii::app()->db->createCommand('select id, `phone`, count(`id`) as count from '.Vendor::tableName()." WHERE `phone` = $keyword AND `status`=1 GROUP BY `phone`;")->queryAll(); $data = array_merge($deals,$vendors); $repdp = new CArrayDataProvider($data, array( 'id'=>'report', 'sort'=>array( 'attributes'=>array( 'count', ), ), 'pagination'=>array( 'pageSize'=>10, ), )); $this->render('List', array('repdp'=>$repdp));
<?php $this->widget('application.extensions.grid.CGridView', array( 'id'=>'ugcrep-grid', 'dataProvider'=>$repdp, 'columns'=>array( 'phone', 'count', ) ));?>
如果想进一步使用过滤器filter,由于缺少对应的数据模型,得自行创建一个model对象,具体方法可参见参考文档2。
也可以简单点在表格外创建一个专门的搜索表单,然后处理相应的搜索逻辑即可。
by iefreer
参考:
http://stackoverflow.com/questions/9538777/using-an-array-as-the-data-source-for-cgridview
http://www.yiiframework.com/forum/index.php/topic/16435-cgridview-filters-with-carraydataprovider/