在Yii2框架中,实现带搜索功能的分页是一个常见的需求,尤其是在构建内容管理系统时。本文档提供了一个实例,主要讲解如何配置模型和使用ActiveDataProvider来实现这一功能。首先,我们关注模型的设置。
**模型配置:**
1. **文章表关联**
在文章模型中,通过`hasOne`方法将文章表与文章类别表(假设名为`ArticleCate`)关联起来,通过`id`字段链接,例如:
```php
public function getCate(){
return $this->hasOne(ArticleCate::className(), ['id' => 'cid']);
}
```
这段代码表示每个文章实例有一个一对一的关系到文章类别,当查询文章时,可以同时获取其所属的类别信息。
2. **搜索模型**
为了支持搜索功能,需要创建一个名为`ArticleSearch`的模型,继承自`Article`并扩展了`Model`。这个模型负责处理搜索条件,并与ActiveDataProvider配合工作。`ArticleSearch`类定义了两个主要方法:
- `rules()`:定义了搜索字段的验证规则,包括`cid`, `created_at`, `updated_at`为整数类型,而`id`, `desc`, `title`, `cover`, `content`为安全类型(允许用户输入任意文本)。
- `search($params)`:此方法接收用户提供的搜索参数,构造查询对象 `$query`,并通过`ActiveDataProvider`进行分页和数据过滤。`$params`参数包含了搜索条件,`$query`初始时是未进行任何筛选的`Article`模型查询。这里设置了每页显示2条记录的分页设置。
**分页和搜索实现**
在`search()`方法中,`$query`被用于存储搜索结果。虽然文档没有详细展示如何直接通过搜索参数来筛选查询,但通常会根据用户的输入动态调整查询条件,比如使用`andFilterWhere()`或`andFilterWhereLike()`等方法。例如,如果用户搜索`$params['title']`,则可能会添加一个`andFilterWhere(['title', 'like', '%'.$params['title'].'%'])`的条件。
`$dataProvider`是关键部分,它封装了查询结果并提供了分页功能。`pagination`属性是一个配置数组,定义了分页参数,如`pageSize`(每页显示的记录数)和可能的分页导航。
总结来说,实现Yii2带搜索的分页功能,主要是通过模型之间的关联和数据访问组件(ActiveRecord)来完成的。搜索模型(`ArticleSearch`)处理用户输入的搜索条件,并将其应用于查询,而ActiveDataProvider则负责将查询结果以分页的方式呈现给前端。通过这样的设计,可以轻松地构建出功能丰富的后台管理系统。