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 相关文章推荐
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
PHP生成压缩文件实例
Feb 07 PHP
php从字符串创建函数的方法
Mar 16 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
php实现留言板功能(会话控制)
May 23 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 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用反撇号执行外部命令
2015/04/14 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
JavaScript 异步调用
2017/10/25 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
python中append实例用法总结
2019/07/30 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
什么是.net
2015/08/03 面试题
linux面试题参考答案(5)
2014/09/01 面试题
大学毕业生通用求职信
2013/09/28 职场文书
质检部职责
2013/12/28 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
团干部培训方案
2014/06/03 职场文书
建筑工地标语
2014/06/18 职场文书
旅游安全责任协议书
2016/03/22 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL