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水印
Mar 16 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
两个强悍的php 图像处理类1
Jun 15 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
PHP GD库生成图像的几个函数总结
Nov 19 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
PHP浮点比较大小的方法
Feb 14 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
php json_encode与json_decode详解及实例
Dec 13 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
php获取ajax的headers方法与内容实例
Dec 27 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
第一节--面向对象编程
2006/11/16 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
使用js实现雪花飘落效果
2013/08/26 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
使用cx_freeze把python打包exe示例
2014/01/24 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
python 日期操作类代码
2018/05/05 Python
python命令行参数用法实例分析
2019/06/25 Python
Python短信轰炸的代码
2020/03/25 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
pandas DataFrame运算的实现
2020/06/14 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
资产评估专业大学生求职信
2013/09/29 职场文书
什么是岗位职责
2013/11/12 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
大学生秋游活动方案
2014/02/17 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
股东协议书范本2016
2016/03/21 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
微信小程序和php的登录实现
2021/04/01 PHP