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 pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
火车采集器 免费版使出收费版本功能实现原理
Sep 17 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
Php图像处理类代码分享
Jan 19 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
PHP children()函数讲解
Feb 03 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
合作指挥官:孟斯克
2020/03/16 星际争霸
深入php多态的实现详解
2013/06/09 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
python读写json文件的简单实现
2017/04/11 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python实现多张图片拼接成大图
2019/01/15 Python
详解如何设置Python环境变量?
2019/05/13 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
单位门卫岗位职责
2013/12/20 职场文书
总裁办公室主任职责
2014/01/02 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
高中社区服务活动报告
2015/02/05 职场文书
关于分班的感言
2015/08/04 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
自考生自我评价
2019/06/21 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
DSP接收机前端设想
2022/04/05 无线电