Yii CGridView 关联表搜索排序实例

在这篇文章中,我准备讲解如何在CGridView中搜索或者排序关联表中的某一行,通过给Yii Blog demo添加一个list页面。

首先,检查你的blog demo里的protected\models\Comment.php,确保Comment模型有一个search的方法,如果没有,就用gii生成一个,我下载到的blog demo里倒是没有。

然后,写代码的时间到了,我们从 CommentController 开始,我们给它加一个 actionList:


1

2

3

4

5

6

7

8

9

10

11

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然后粘贴以下代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?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 就行了:


1

2

3

4

5

6

‘columns‘=>array(

    ‘content‘,

    ‘post.title‘,

    ‘status‘,

    ‘author‘,

),

现在如果你访问以下这个页面,发现文章的标题的确显示出来了

问题

如果你仔细瞅瞅这个页面你会发现你无法搜索文章标题,你也没办法按文章标题排序,这是因为 CGridView 在给定的 column name 里面发现了一个‘.’,也就是 post.title 的点。如果有点号的话,它就不会生成搜索框。

解决方案

要想解决这个问题,我们得费点力气。首先我们得给Commen模型添加一个 getter 和一个 setter ,比如说这么写:


1

2

3

4

5

6

7

8

9

10

11

12

13

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 函数里:


1

2

3

4

5

6

7

8

9

10

11

12

13

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:


1

2

3

4

5

6

7

$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);

然后我们添加排序:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

$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 :


1

2

3

4

return new CActiveDataProvider(‘Comment‘array(

    ‘criteria‘=>$criteria,

    ‘sort‘=>$sort

));

现在我们要做的就是修改我们的 view 以便它在 CGridView 显示想要显示的属性:


1

2

3

4

5

6

‘columns‘=>array(

    ‘content‘,

    ‘postTitle‘,

    ‘status‘,

    ‘author‘,

),

刷新一下,应该可以了:

感觉还不错:-D。你可以自由地分享这篇文章,hankcs翻译自:

http://www.mrsoundless.com/php/yii/searching-and-sorting-a-column-from-a-related-table-in-a-cgridview/

时间: 2024-10-08 00:39:12

Yii CGridView 关联表搜索排序实例的相关文章

Yii框架常见问题: CGridView关联表字段的filter问题解决

Model: 1. 添加filter用的属性var $a = "";var $b = ""; 2. 修改rules方法中的配置array('--., a, b', 'safe', 'on'=>'search'); 3. 注意relations方法public function relations(){// NOTE: you may need to adjust the relation name and the related// class name fo

EF框架下 Linq语句多表联查排序实例

一些原因需要用到linq的多表联查,网上查了下资料,顺便整理了一下,包括了模糊查询,分页,排序字段. 话不多说,直接上代码 public List<ExamineUserEntity> GetUserExamineList(string username, string phone, int pageindex, int pagesize) { var query = (from exam in db.T_USEREXAMINE join user in db.T_EXAMINE_USER o

Yii CGridView 基本使用(三)关联表相关字段搜索

添加 关联表 相关字段的搜索: 先说一句,我们在这里只谈 "一对多" 的关联搜索,首先,不要忘了我们的数据库,忘记的同学请戳这里:这里,可以看到在 tbl_post 中是有一个外键关联到 tbl_user 表的,用以查找作者的相关信息.建了数据库之后,看看我们生成的 Yii 代码的 POST 的 Model, 里面的 realtion 如下(忽略 comment 的): /** * @return array relational rules. */ public function r

yii关系数据库多表查询

两个表的model继承自CActiveRecord class User extends CActiveRecord class Post extends CActiveRecord 很明显,User和Post是一对多的关系 在两个Model中覆盖relations方法 //class Post public function relations() { return array( 'author'=>array(self::BELONGS_TO, 'User', 'id') ); } // 格

Oracle中关联表的视图创建

这几天的工作基本上没有了比较的新的技术点,就是反反复复的修改需求,修改Bug--当然,也是到了此刻,自己猜觉得在一个庞大的项目中,需求分析的重要性,以及需求说明书的重要性.我们在需求模糊.文档缺乏的条件下,反复修改功能已经成了家常便饭,今天领导说这个功能应该这样,我们就要立刻改到这样,第二天领导说又要原来的那样,我们只能再改回去了--有时候,我们也曾调侃自己是典型的面向领导开发-- 今天没有什么比较新的技术点来总结了,自己回顾了一下,这几天的工作,发现在关联表中创建视图的时候对于连接不是特别熟悉

Mysql学生管理系统:表的建立,外键一对多,多对多关系,中间关联表的建立

学生管理系统 管理员注册/登录/注销 注册班级(班级详细信息) 注册学生信息 查看班级信息/查看老师资料 教师注册/注销  查看教师资料  查看学生资料  根据名称/班级/ 查看学生详细信息--支持模糊 注册科目 管理员(admini) ad_id(管理员id)     ad_number(管理员账号) ad_pass(管理员密码)    ad_yn(管理员是否禁用) create table admini( ad_id int PRIMARY KEY AUTO_INCREMENT,-- 主键自

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

MongoDB之DBref(关联插入,查询,删除) 实例深入

MongoDB之DBref(关联插入,查询,删除) 实例深入 如图所示,A,B,C三个Collection互相关联. 其中的数字为document的value值. 关于DBref的入门可以看http://blog.csdn.net/crazyjixiang/article/details/6616678这篇文章. 我们先建立A collection. Cpp代码 > var a={value:"1"} > var b={value:"2"} > v

[PHP]更新中间关联表数据的两种思路

/*--------------------------------------------------------------------------------------------------------- @黑眼诗人 <www.chenwei.ws> ---------------------------------------------------------------------------------------------------------*/ 中间关联表:这里的中