Yii2-GridView给关联字段添加搜索和排序功能
2016-11-01
本文同时收录于 超能小紫的Yii2学习笔记
需求
一个试用申请平台,需要在试用申请列表(Application)内展示申请人(User)姓名
准备工作
用gii生成Model、CRUD
如果你不知道什么是gii,请不要跟别人说你会用yii
数据库结构
申请表application 含有字段 user_id 与 用户表user 的 id 字段一对一关联
第一步
给Application模型添加如下方法
public function getUser()
{
return $this->hasOne(User::className(), ['id'=>'user_id']);
}
如果你不知道这有什么用,请阅读 Yii2手册 内的 查询关联的数据 一节
第二步
给ApplicationSearch模型添加一个属性
public $user_name;
这个属性用于存放申请人姓名,在后续操作中yii会自动调用它;
在 rules()
方法中将 user_name
设为 safe。例如这样
public function rules()
{
return [
[['user_name'], 'safe'],
];
}
否则的话,在后续的搜索时会被yii认为是不安全的字段而丢弃
第三步
修改ApplicationSearch模型的search
方法
$query = Application::find();
$query->joinWith(['user']); // 关联user表
然后添加排序,在
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
后面添加如下代码
$sort = $dataProvider->getSort(); // 获取yii自动生成的排序规则
$sort->attributes['user_name'] = [ // 添加用户名的排序规则
'asc' => ['{{%user}}.name' => SORT_ASC],
'desc' => ['{{%user}}.name' => SORT_DESC],
];
$dataProvider->setSort($sort); // 设置排序规则
这样就可以正常排序了。然后再添加搜索功能
$query->andFilterWhere(['like', '{{%user}}.name', $this->user_name]);
第四步
修改视图层 application/index 内的 GridView::widget()
参数,给 columns
数组添加以下成员:
[
'attribute' => 'user_name',
'label'=>'申请人姓名',
'value' => 'user.name',
'filter'=>Html::activeTextInput($searchModel, 'user_name', ['class'=>'form-control']), // 生成一个搜索框
],
至此,刷新浏览器,应该就可以看到关联字段被正常显示并支持搜索、排序了
学习到了。谢谢
学习到了!!谢谢博主分享