Yii中CGridView关联表搜索排序方法实例详解


Posted in PHP onDecember 03, 2014

本文实例讲述了Yii中CGridView关联表搜索排序方法。分享给大家供大家参考。具体实现方法如下:

在Yii CGridView 关联表搜索排序实现方法有点复杂,今天看了一老外写的了篇游戏,下面我整理一下与各位朋友分享一下,相信会对大家Yii框架的学习有所帮助。

首先,检查你的blog demo里的protectedmodelsComment.php,确保Comment模型有一个search的方法,如果没有,就用gii生成一个,我下载到的blog demo里倒是没有。

然后,写代码的时间到了,我们从 CommentController 开始,我们给它加一个 actionList:

public function actionList()

{

    $model=new Comment('search');

    $model->unsetAttributes();

    if(isset($_GET['Comment']))

        $model->attributes=$_GET['Comment'];

  

    $this->render('list',array(

        'model'=>$model,

    ));

}

着看起来没什么了不起的,跟你用gii生成的crud代码里的一样。现在让我来创建view,在 /protected/views/comment/ 目录下创建list.php然后粘贴以下代码

<?php $this->breadcrumbs=array(

    'Comments',

);

?>

 

<h1>Manage Comments</h1>

 

<?php $this->widget('zii.widgets.grid.CGridView', array(

    'dataProvider'=>$model->search(),

    'filter'=>$model,

    'columns' => array(

                'content',

                'post.title',

                'status',

                'author' 

        ),

));

?>

Comment List

这是一个基本的 CGridView 只显示评论的‘content', ‘status' and ‘author', 和文章的标题。我们假设想要往这张list里添加一列文章的标题,我们只需要添加post.title 就行了:

'columns'=>array(

    'content',

    'post.title',

    'status',

    'author',

),

现在如果你访问以下这个页面,发现文章的标题的确显示出来了

Yii中CGridView关联表搜索排序方法实例详解

问题:

如果你仔细瞅瞅这个页面你会发现你无法搜索文章标题,你也没办法按文章标题排序,这是因为 CGridView 在给定的 column name 里面发现了一个‘.',也就是 post.title 的点。如果有点号的话,它就不会生成搜索框。

解决方案:

要想解决这个问题,我们得费点力气。首先我们得给Commen模型添加一个 getter 和一个 setter ,比如说这么写:

private $_postTitle = null;

public function getPostTitle()

{

    if ($this->_postTitle === null && $this->post !== null)

    {

        $this->_postTitle = $this->post->title;

    }

    return $this->_postTitle;

}

public function setPostTitle($value)

{

    $this->_postTitle = $value;

}

接下来将这个属性添加到 rules 函数里:

public function rules()

{

    // NOTE: you should only define rules for those attributes that

    // will receive user inputs.

    return array(

        array('content, author, email', 'required'),

        array('author, email, url', 'length', 'max'=>128),

        array('email','email'),

        array('url','url')

  

        array('content, postTitle, status, author', 'safe', 'on'=>'search'),

    );

}

这还不够,最需要改动的是我们的 search 函数。首先我们要添一个 criteria:

$criteria=new CDbCriteria;

$criteria->with = "post"; // 确保查询 post 表

  

$criteria->compare('t.content',$this->content,true);

$criteria->compare('t.status',$this->status);

$criteria->compare('t.author',$this->author,true);

$criteria->compare('post.title', $this->postTitle,true);

然后我们添加排序:

$sort = new CSort();

$sort->attributes = array(

    'defaultOrder'=>'t.create_time DESC',

    'content'=>array(

        'asc'=>'t.content',

        'desc'=>'t.content desc',

    ),

    'status'=>array(

        'asc'=>'t.status',

        'desc'=>'t.status desc',

    ),

    'author'=>array(

        'asc'=>'t.author',

        'desc'=>'t.author desc',

    ),

    'postTitle'=>array(

        'asc'=>'post.title',

        'desc'=>'post.title desc',

    ),

);

你也许注意到了我在使用完整的 ‘tablename'.'columnname'语法,我这么做的原因是为了避免 mysql 抛出‘column is ambigious error'。

为了保证这一切正常运行,我们必须传递 CSort 实例和 CDbCriteria 实例给 CActiveDataProvider :

return new CActiveDataProvider('Comment', array(

    'criteria'=>$criteria,

    'sort'=>$sort

));
return new CActiveDataProvider('Comment', array(

    'criteria'=>$criteria,

    'sort'=>$sort

));

现在我们要做的就是修改我们的 view 以便它在 CGridView 显示想要显示的属性:

'columns'=>array(

    'content',

    'postTitle',

    'status',

    'author',

),

刷新一下,应该可以了,效果如下图所示:

Yii中CGridView关联表搜索排序方法实例详解

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
php的access操作类
Apr 09 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHP文件缓存类实现代码
Oct 26 PHP
php curl常用的5个经典例子
Jan 20 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 #PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 #PHP
Yii实现多按钮保存与提交的方法
Dec 03 #PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 #PHP
Yii框架登录流程分析
Dec 03 #PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 #PHP
PHP多线程类及用法实例
Dec 03 #PHP
You might like
php实现mysql数据库操作类分享
2014/02/14 PHP
PHP反射实际应用示例
2019/04/03 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
python实现文本文件合并
2015/12/29 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
python库matplotlib绘制坐标图
2019/10/18 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
Python加速程序运行的方法
2020/07/29 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
学校食堂食品安全责任书
2014/07/28 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
给客户的检讨书
2014/12/21 职场文书
春季运动会开幕词
2015/01/28 职场文书
《落花生》教学反思
2016/02/16 职场文书