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翻译自:
Yii CGridView 关联表搜索排序实例的更多相关文章
- Yii 1开发日记 -- 后台搜索功能下拉及关联表搜索
Yii 1 实现后台搜索,效果如下: 一. 下拉搜索: 1.模型中和常规的一样 if (isset($_GET['agency']['status']) && $_GET['agenc ...
- Yii CGridView 基本使用(三)关联表相关字段搜索
加入 关联表 相关字段的搜索: 先说一句,我们在这里仅仅谈 "一对多" 的关联搜索,首先,不要忘了我们的数据库,忘记的同学请戳这里:这里.能够看到在 tbl_post 中是有一个外 ...
- YII关联字段并带搜索排序功能
1.简介 从接触yii框架到现在已经快有两个月了,但是自己对yii框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...
- Yii框架 多表查询实例
Yii框架多表查询实例:总共分为两个步骤(以下的代码我全部都写在model中):1.先在主表model中声明关联表中所需要查询的字段. public $surveyls_description; // ...
- Yii 三表关联 角色表、角色权限连接表、权限表
Yii 三表关联 角色表.角色权限连接表.权限表 角色表 role----------------id 唯一序号name 角色名称---------------- 角色权限连接表 lp-------- ...
- 后盾网lavarel视频项目---lavarel多表关联一对多操作实例
后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...
- AppBox升级进行时 - 关联表查询与更新(Entity Framework)
AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 关联表的查询操作 使用 Include 方法,我们可以在一次数据库查询中将关联 ...
- 搜索实时个性化模型——基于FTRL和个性化推荐的搜索排序优化
本文来自网易云社区 作者:穆学锋 简介:传统的搜索个性化做法是定义个性化的标签,将用户和商品通过个性化标签关联起来,在搜索时进行匹配.传统做法的用户特征基本是离线计算获得,不够实时:个性化标签虽然具有 ...
随机推荐
- [bug]小米部分机型(5x、mix2)中,文字/背景闪现然后消失
2/9更新 后来遇到float 元素也这样,改成flex布局就没问题.不知道具体原因. 描述: 使用vue 2.4开发HTML5时,遇到在小米部分机型(5x.mix2)中,文字/文字背景闪现然后消失. ...
- vertical-tical
通常我们需要垂直对齐并排的元素. CSS提供了一些可实现的方法:有时我用浮动float来解决,有时用position: absolute来解决,有时甚至是“肮脏”地手动添加的margin或paddin ...
- 异步加载的JS如何在chrome浏览器断点调试?
我们常常利用chrome强大的控制台Sources下面进行代码断点调试,但是通过$.getScript等异步加载JS的方式在Sources里面就是找不到,那如何进行debug断点调试呢? 方案一: 在 ...
- 剑指offer五十九之按之字形顺序打印二叉树
一.题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.二.思路 详见代码 三.代码 import j ...
- (转)Python中集合(set)的基本操作以及一些常见的用法
原文:http://blog.51cto.com/10616534/1944841 Python除了List.Tuple.Dict等常用数据类型外,还有一种数据类型叫做集合(set),集合的最大特点是 ...
- 搭建互联网架构学习--006--duboo准备之zk集群部署安装
dubbo集群部署安装依赖于zookeeper,所以先安装zookeeper集群. 1.准备三台机器做集群 2.配置 配置java环境 ,2,修改操作系统的/etc/hosts文件,添加IP与主机名 ...
- CGI PL PERL脚本 提权
windows 2003 下,安装ActivePerl-5.16.2.1602-MSWin32-x86-296513 IIS 添加CGI支持.并在对应网站配置下面,添加CGI后缀或PL后缀 与 对应的 ...
- 解释mysql 语句 ——解释CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
在我们创建mysql数据库的时候我们经常会用到这句SQL:CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ ...
- gcc 混合连接动态库和静态库
当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式.这时需要作用-Wl的方式 gcc test.cpp -L. -Wl,-Bstatic -ltestlib -W ...
- DAO设计模式(转)
J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码. 我们先来回顾一下DAO设计模式和数据访问对象. DAO基础 ...