### 需求
一個試用申請平臺,需要在試用申請列表(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']), // 生成一個搜索框
],
```
至此,刷新瀏覽器,應該就可以看到關聯字段被正常顯示并支持搜索、排序了