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 08 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
php简单浏览目录内容的实现代码
Jun 07 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
在laravel框架中使用model层的方法
Oct 08 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
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
python 生成图形验证码的方法示例
2018/11/11 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
Python socket处理client连接过程解析
2020/03/18 Python
python实现扫雷游戏的示例
2020/10/20 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
国培计划培训感言
2014/03/11 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
记者节感言
2015/08/03 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
golang 实现并发求和
2021/05/08 Golang
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS