Yii2.0 GridView实现两表联查、搜索与分页详解

0 下载量 22 浏览量 更新于2024-08-31 收藏 69KB PDF 举报
"Yii2.0小部件GridView用于实现两表联查、搜索和分页功能的代码示例。在Yii2.0框架中,GridView是常用的数据展示工具,能够方便地处理复杂的数据操作,如关联查询、筛选和分页。" 在Yii2.0框架中,GridView是一个强大的小部件,常用于显示和操作数据库中的数据。当需要展示的数据涉及多张表时,例如这里提到的"两表联查",GridView可以通过关联模型(AR, Active Record)来处理这些关系。以下将详细介绍如何实现这个功能: 1. 两表联查: - 在Yii2.0中,通过Active Record的`hasOne()`或`hasMany()`方法定义模型之间的关联。例如,如果有一个`BooksInfo`模型对应书籍信息,另一个`Authors`模型对应作者信息,可以通过在`BooksInfo`模型中定义一个`hasOne()`方法来关联作者表。 ```php public function getAuthor() { return $this->hasOne(Authors::className(), ['author_id' => 'author_id']); } ``` 2. 搜索功能: - 实现搜索功能通常需要创建一个搜索模型(如`InfoSearch`),它继承自原模型,并添加用于搜索的属性和规则。在`search()`方法中,使用`yii\base\Model::load()`加载请求的参数,并根据这些参数调整查询条件。 ```php public function search($params) { $query = BooksInfo::find(); // 加载并验证搜索参数 $this->load($params); // 添加关联字段到查询条件 if (!empty($this->author_name)) { $query->joinWith('author') ->andFilterWhere(['like', 'authors.author_name', $this->author_name]); } // 分页和排序 $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => [ 'attributes' => ['title', 'author_name'], // 可排序的属性包括原模型字段和关联模型字段 ], 'pagination' => [ 'pageSize' => 2, ], ]); return $dataProvider; } ``` 3. 分页: - 分页功能由`ActiveDataProvider`自动处理。在控制器中创建数据提供者,并设置每页显示的记录数。 ```php public function actionIndex() { $searchModel = new InfoSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); } ``` 4. 视图层View: - 最后,在视图文件中使用`GridView`小部件展示数据。设置`columns`属性以指定显示的列,包括原模型的字段和关联模型的字段。例如: ```php <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'title', ['attribute' => 'author.author_name', 'label' => 'Author Name'], // 其他列... ['class' => 'yii\grid\ActionColumn'], ], ]); ?> ``` 以上代码展示了Yii2.0小部件GridView如何处理两表联查、搜索和分页功能。在实际应用中,你可能需要根据具体需求调整搜索条件、排序规则以及展示的列。通过这种方式,开发者可以轻松地创建功能丰富的数据展示界面,同时保持代码的简洁和可维护性。