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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
php中获取指定IP的物理地址的代码(正则表达式)
Jun 23 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
使用php伪造referer的方法 利用referer防止图片盗链
Jan 20 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
国产PHP开发框架myqee新手快速入门教程
Jul 14 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
PHP合并数组+号和array_merge的区别
Jun 25 PHP
php倒计时出现-0情况的解决方法
Jul 28 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
Laravel5.1 框架路由基础详解
Jan 04 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
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
php数据序列化测试实例详解
2017/08/12 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
vue项目出现页面空白的解决方案
2019/10/31 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
wxpython 学习笔记 第一天
2009/02/09 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
python hash每次调用结果不同的原因
2019/11/21 Python
YUV转为jpg图像的实现
2019/12/09 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
python如何使用代码运行助手
2020/07/03 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
10个顶级Python实用库推荐
2021/03/04 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
银行柜员应聘推荐信范文
2013/11/24 职场文书
护理学专业求职信
2014/06/29 职场文书
无私奉献演讲稿
2014/09/04 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
Python pygame实现中国象棋单机版源码
2021/06/20 Python
nginx静态资源的服务器配置方法
2022/07/07 Servers