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