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数组函数
Aug 18 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
Dec 25 PHP
php长字符串定义方法
Jul 12 PHP
php include和require的区别深入解析
Jun 17 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
PHP两种快速排序算法实例
Feb 15 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
php+mysql实现的二级联动菜单效果详解
May 10 PHP
PHP微信支付开发实例
Jun 22 PHP
购物车实现的几种方式优缺点对比
May 02 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 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教程 基本语法
2009/10/23 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
numpy数组广播的机制
2019/07/12 Python
python怎么删除缓存文件
2020/07/19 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
Python 中Operator模块的使用
2021/01/30 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
简历中求职的个人自我评价
2013/12/03 职场文书
护理不良事件检讨书
2014/02/06 职场文书
《胡杨》教学反思
2014/02/16 职场文书
市级文明单位申报材料
2014/05/07 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
MySql分区类型及创建分区的方法
2022/04/13 MySQL