Yii: CGridView设置关联表格数据过滤和排序
2014-03-09 00:38
756 查看
使用Yii的CGridView作为表格控件来展示数据,方法很简单,在模型中定义search函数,视图中使用如下:
上面显示单个表格数据没有问题。
现在的问题是需要显示多个关联表格的数据,比如这样3个表:Deal, Category, Detail
关系是Deal has many Details, Deal belongs to Category
要把分类标识(Category::title)和产品标题(Detail::subject)显示在同一张表格中。
那么直接的想法就是把上面视图代码修改为:
不过这样只能显示数据,不能对这两个新增字段进行过滤和排序。
解决方法需要针对上面两种不同的情况做出处理:
1、对BELONGS_TO关系的处理即Category.title,这个已经有文章详细描述,可参见
http://www.mrsoundless.com/post/2011/05/09/Searching-and-sorting-a-column-from-a-related-table-in-a-CGridView.aspx
思路就是
*)为模型添加属性及其读写方法
*)然后定义关联关系(relations)
*)添加新字段到搜索规则中
*)使用with进行积极关联查询,设置相应的criteria和sort,其中新属性前缀使用关联表名,如:
2、对HAS_MANY/MANY_MANY关系的处理要复杂些,这里以HAS_MANY为例。
Detail在关联查询结果中是数组形式的数据,直接通过Detail.subject是访问不到正确的产品标题数据的。
需要对数组数据进行过滤,得到唯一的值,因此需要实现一个获取唯一产品标题的方法,比如:
然后在搜索条件中使用该方法。
上面说的是搜索,下面简单说明排序的实现,思路是传递sort实例给数据容器对象。
上面说的是搜索,下面简单说明排序的实现,思路是传递sort实例给数据容器对象。
<pre name="code" class="php"><?php $this->widget('application.extensions.grid.FGridView', array( 'id'=>'grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'status', 'created', 'Detail.subject', 'Category.title' ) ));?></pre>
上面显示单个表格数据没有问题。
现在的问题是需要显示多个关联表格的数据,比如这样3个表:Deal, Category, Detail
关系是Deal has many Details, Deal belongs to Category
要把分类标识(Category::title)和产品标题(Detail::subject)显示在同一张表格中。
那么直接的想法就是把上面视图代码修改为:
<?php $this->widget('application.extensions.grid.FGridView', array( 'id'=>'grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'status', 'created', <span style="color:#FF0000;"><em> 'Category.title', 'Detail.subject'</em></span> ) ));?>
不过这样只能显示数据,不能对这两个新增字段进行过滤和排序。
解决方法需要针对上面两种不同的情况做出处理:
1、对BELONGS_TO关系的处理即Category.title,这个已经有文章详细描述,可参见
http://www.mrsoundless.com/post/2011/05/09/Searching-and-sorting-a-column-from-a-related-table-in-a-CGridView.aspx
思路就是
*)为模型添加属性及其读写方法
*)然后定义关联关系(relations)
*)添加新字段到搜索规则中
*)使用with进行积极关联查询,设置相应的criteria和sort,其中新属性前缀使用关联表名,如:
public function relations() { return array( 'DealDetails' => array(self::HAS_MANY, 'DealDetail', 'deal_id'), ); }
......//in search function $criteria->compare('Category.title','KTV'); ......
2、对HAS_MANY/MANY_MANY关系的处理要复杂些,这里以HAS_MANY为例。
Detail在关联查询结果中是数组形式的数据,直接通过Detail.subject是访问不到正确的产品标题数据的。
需要对数组数据进行过滤,得到唯一的值,因此需要实现一个获取唯一产品标题的方法,比如:
public function getSubject() { if ($this->_subject === null && $this->DealDetails !== null){ foreach($this->DealDetails as $dealdetail) { if($dealdetail->lang_id == '2')//english $this->_subject = $dealdetail->subject; } } return $this->_subject; }
然后在搜索条件中使用该方法。
上面说的是搜索,下面简单说明排序的实现,思路是传递sort实例给数据容器对象。
上面说的是搜索,下面简单说明排序的实现,思路是传递sort实例给数据容器对象。
......//in search function $sort = new CSort(); $sort->attributes = array( 'defaultOrder'=>'t.created DESC', 'status'=>array( 'asc'=>'t.status', 'desc'=>'t.status desc', ), 'subject'=>array( 'asc'=>'DealDetails.subject', 'desc'=>'DealDetails.subject desc', ), 'created' ); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'pagination'=>array( 'pageSize'=>10, ), 'sort'=>$sort )); ......
相关文章推荐
- Yii: CGridView设置关联表格数据过滤和排序
- kettle案例六数据表关联--排序记录-记录集连接-过滤记录
- AngularJS敏感词过滤,下拉菜单排序,表格隔行换色,添加数据
- Yii中CGridView禁止列排序的设置方法
- 设置数据窗口的过滤与排序
- 金蝶EAS,分录表格中F7字段实现数据过滤,FilterInfo多条件关系设置
- 第二种办法:Yii2中关联数据表数据在gridview中的显示,查询(search)和排序(sort)等。
- CCSv5 断点与grphic实时刷新及实时导入导出数据关联(原CCS3.3 探针设置)
- Filter(一)——设置SimpleAdapter的Filter从而过滤数据
- tablesorter表格排序控件,数据删除后更新重新排序解决方案。。。
- 关于同时设置 VAR_FILTERS 和 DEFAULT_FILTER 造成数据二次过滤的BUG
- EasyUI+Hibernate实现表格多层属性本地列排序、搜索过滤功能
- YII中actionadmin对应的gridview数据的排序
- Word表格多页表格标题行迅速设定表格里面数据地排序【xp系统下载】
- 通过QtMVC实现视图数据分离与数据的排序及过滤显示
- Oracle:过滤和排序数据
- 表格F7后台数据设置
- ExtJS中表格控件的使用,属性设置和数据的获取
- EasyUI中tree,Datagrid,pagenation的使用EasyUI中Datagrid和pagenation进行关联时,再次点击pagenation时让表格数据显示的问题
- JXCELL实例学习与研究(四) 之 录入数据、绘制表格、修整线性表的颜色 密码的设置与破译