Yii: CGridView设置关联表格数据过滤和排序
来源:互联网 发布:验证码java代码 编辑:程序博客网 时间:2024/05/01 03:02
使用Yii的CGridView作为表格控件来展示数据,方法很简单,在模型中定义search函数,视图中使用如下:
<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设置关联表格数据过滤和排序
- Yii: CGridView设置关联表格数据过滤和排序
- Yii中CGridView单元格组件和数据提供者的使用
- 自定义 Yii CGridView 和 CListView 组件
- yii的CListView和CGridView之分页
- Yii:如何更改CGridView组件中的droplist默认过滤条件
- Java Swing JTable 表格【14:表格的排序和过滤】
- Yii Framework CGridView详解
- Yii Framework CGridView详解
- Yii CGridView使用
- yii cgridview 自选按钮
- Yii CGridView详解
- Oracle:过滤和排序数据
- 3. 过滤和排序数据
- 过滤和排序数据1
- Yii DataProvider和CGridView的几个小提示
- element 表格和分页组件数据关联
- Yii CGridView 基本使用(三)关联表相关字段搜索
- 题目1021:统计字符 2007年浙江大学计算机及软件工程研究生机试真题
- 流殇三月,誓言碎落于天涯
- 代码审查和不良编程习惯
- Yii-数据库操作-多表关联
- 把笑容酿成毒酒,与君共饮
- Yii: CGridView设置关联表格数据过滤和排序
- MySQL删除/更新数据时报1175错误
- PAT 1068. Find More Coins
- The connection to adb is down, and a severe error has occured.
- 数组中只出现一次的数
- Struts2的自动类型转换及自定义类型转换
- 优秀的linux学习网站(转载)
- (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议
- Java常用排序算法/程序员必须掌握的8大排序算法