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 相关文章推荐
支持php4、php5的mysql数据库操作类
Jan 10 PHP
计算php页面运行时间的函数介绍
Jul 01 PHP
一个图片地址分解程序(用于PHP小偷程序)
Aug 23 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
PHP魔术方法的使用示例
Jun 23 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
php中的登陆login实例代码
Jun 20 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
laravel异步监控定时调度器实例详解
Jun 21 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模板技术原理【一】
2008/01/10 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
分析python切片原理和方法
2017/12/19 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
《鱼游到了纸上》教学反思
2014/02/20 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android