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

添加 关联表 相关字段的搜索:

     先说一句,我们在这里只谈 ”一对多“ 的关联搜索,首先,不要忘了我们的数据库,忘记的同学请戳这里:这里,可以看到在 tbl_post 中是有一个外键关联到 tbl_user 表的,用以查找作者的相关信息。建了数据库之后,看看我们生成的 Yii 代码的 POST 的 Model, 里面的 realtion 如下(忽略 comment 的):

[php]  view plain  copy
  1. /** 
  2.  * @return array relational rules. 
  3.  */  
  4. public function relations()  
  5. {  
  6.     // NOTE: you may need to adjust the relation name and the related  
  7.     // class name for the relations automatically generated below.  
  8.     return array(  
  9.         'comments' => array(self::HAS_MANY, 'Comment''post_id'),  
  10.         'author' => array(self::BELONGS_TO, 'User''author_id'),  
  11.     );  
  12. }  
    可以看到 POST 和 USER 表可以通过 author 键进行访问,例如: $model->author->nickname,而且 这里是 BELONGS_TO 关系。

    说了这么多,我们的需求究竟是什么?....


     产品经理推了推眼镜:”我们要在日志的后台管理界面加一个功能,可以通过作者名称搜索到相应的文章。这个比较急,今晚就要完成。“


    淡定淡定,不就是改需求吗。忽略进度要求,我们研究一下究竟要做什么。

    其实很简单的,不就是在 POST 的 admin 界面中增加一列作者名称,然后可以通过作者名的 模糊搜索 去找到对应日志吗?看看代码,要是通过 作者 id 去搜索不就简单了吗?不过这样确实不太友好...如果是展示作者名字而已不也是很简单吗?加一个 header 然后 value 是 $data->author->username, 问题是这样只能展示,不能进行搜索...哎,好苦恼。

    淡定淡定,不就是多个搜索吗?来,让我告诉你怎么做。


    首先,我们进入 POST 的 model,在一开始的地方添加一个属性:

[php]  view plain  copy
  1. class Post extends CActiveRecord  
  2. {  
  3.     public $name//添加一个 public 属性,代表作者名  
    然后改一下 Model 里面 search 的代码,改动部分都已经加了注释:

[php]  view plain  copy
  1. public function search()  
  2. {  
  3.     // @todo Please modify the following code to remove attributes that should not be searched.  
  4.   
  5.     $criteria=new CDbCriteria;  
  6.   
  7.     $criteria->with = array('author');  //添加了和 author 的渴求式加载  
  8.   
  9.     $criteria->compare('post_id',$this->post_id);  
  10.     $criteria->compare('title',$this->title,true);  
  11.     $criteria->compare('content',$this->content,true);  
  12.     $criteria->compare('tags',$this->tags,true);  
  13.     $criteria->compare('status',$this->status);  
  14.     $criteria->compare('create_time',$this->create_time);  
  15.     $criteria->compare('update_time',$this->update_time);  
  16.     $criteria->compare('author_id',$this->author_id);  
  17.   
  18.     //这里添加了一个 compare, username 是 User 表的字段,$this->name 是我们添加的属性,true 为模糊搜索  
  19.     $criteria->compare('username',$this->name,true);  
  20.   
  21.     return new CActiveDataProvider($thisarray(  
  22.         'criteria'=>$criteria,  
  23.     ));  
  24. }  


    然后在 view 里面,就是 post 文件夹的 admin.php ,CGridView 改为下面代码:

[php]  view plain  copy
  1. <?php $this->widget('zii.widgets.grid.CGridView'array(  
  2.     'id'=>'post-grid',  
  3.     'dataProvider'=>$model->search(),  
  4.     'filter'=>$model,  
  5.     'columns'=>array(  
  6.         'post_id',  
  7.         'title',  
  8.         'content',  
  9.         'tags',  
  10.         'status',  
  11.         'create_time',  
  12.         'update_time',  
  13.         'author_id',  
  14.         /*下面就是添加的代码啊*/  
  15.         array(  
  16.             'name'=>'作者名称',  
  17.             'value'=>'$data->author->username',  //定义展示的 value 值  
  18.             'filter'=>CHtml::activeTextField($model,'name'), //添加搜索 filter  
  19.         ),  
  20.         array(  
  21.             'class'=>'CButtonColumn',  
  22.         ),  
  23.     ),  
  24. )); ?>  
    你是不是发现现在有了搜索框但是不起作用呢?哈哈,所以我们说文章要坚持看到最后。我们要做的最后一步,就是在 rule 里面,把 name 属性加入到安全搜索字段中,要不然会被 Yii 认为是不安全字段而过滤掉的。看,就在下面函数的最后一行,safe 前面多了个 name ....

[php]  view plain  copy
  1. public function rules()  
  2. {  
  3.     // NOTE: you should only define rules for those attributes that  
  4.     // will receive user inputs.  
  5.     return array(  
  6.         array('title, content, status, author_id''required'),  
  7.         array('status, create_time, update_time, author_id''numerical''integerOnly'=>true),  
  8.         array('title''length''max'=>128),  
  9.         array('tags''safe'),  
  10.         // The following rule is used by search().  
  11.         // @todo Please remove those attributes that should not be searched.  
  12.         array('post_id, title, content, tags, status, create_time, update_time, author_id, name''safe''on'=>'search'),  
  13.     );  
  14. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值