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 相关文章推荐
也谈截取首页新闻 - 范例
Oct 09 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 PHP
php网页版聊天软件实现代码
Aug 12 PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 PHP
Yii2框架类自动加载机制实例分析
May 02 PHP
php使用fullcalendar日历插件详解
Mar 06 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/02 日漫
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
JavaScript类的写法
2016/09/17 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
vue的一个分页组件的示例代码
2017/12/25 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
python3.3实现乘法表示例
2014/02/07 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
Python中pass的作用与使用教程
2020/11/13 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
香港士多网上超级市场:Ztore
2021/01/09 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
司机辞职报告范文
2014/01/20 职场文书
股东合作协议书范本
2014/04/14 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2014年审计工作总结
2014/11/17 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书