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 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
php实现异步数据调用的方法
Dec 24 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
php连接oracle数据库的核心步骤
May 26 PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 PHP
实例解析php的数据类型
Oct 24 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
nodejs基础知识
2017/02/03 NodeJs
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
js验证账户名是否重复
2020/05/26 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python文字转语音的实例代码分析
2019/11/12 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
环境工程专业个人求职信
2013/12/05 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
网络技术专业推荐信
2014/02/20 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
建国大业观后感
2015/06/01 职场文书
放假通知怎么写
2015/08/18 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
nginx配置之并发频次限制
2022/04/18 Servers