### 需求 一个试用申请平台,需要在试用申请列表(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']), // 生成一个搜索框 ], ``` 至此,刷新浏览器,应该就可以看到关联字段被正常显示并支持搜索、排序了