yii

Yii2-GridView给关联字段添加搜索和排序功能

1680
2
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']), // 生成一个搜索框
],

至此,刷新浏览器,应该就可以看到关联字段被正常显示并支持搜索、排序了

昵称
邮箱
网址
程序猿学习笔记的头像 2020-04-24 14:01

学习到了。谢谢

工控资料窝的头像 2016-11-03 14:40

学习到了!!谢谢博主分享