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 相关文章推荐
一个好用的分页函数
Nov 16 PHP
一家之言的经验之谈php+mysql扎实个人基本功
Mar 27 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
YII实现分页的方法
Jul 09 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
php中instanceof 与 is_a()区别分析
Mar 03 PHP
PHP实现动态柱状图改进版
Mar 30 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
php实现的双色球算法示例
Jun 20 PHP
如何修改yii2.0自带的user表为其它的表
Aug 01 PHP
基于laravel Request的所有方法详解
Sep 29 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 ajax异步读取rss文档数据
2016/03/29 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
php连接mysql数据库
2017/03/21 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
angular2使用简单介绍
2016/03/01 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
python 对类的成员函数开启线程的方法
2019/01/22 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Python编写万花尺图案实例
2021/01/03 Python
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
简历里的自我评价
2014/01/31 职场文书
大学活动总结范文
2014/04/29 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android