悠悠楠杉
在ThinkPHP6中使用mysql进行分页查询的实现代码
1. 数据库准备
首先,确保你的数据库中有一个表(例如名为articles
),该表包含以下字段:
- id
:主键,自增。
- title
:文章标题。
- keywords
:文章关键词。
- description
:文章描述。
- content
:文章正文。
2. 创建模型
在应用的model
目录下创建一个名为Article
的模型文件(例如application/model/Article.php
),用于与数据库的交互:
```php
<?php
namespace app\model;
use think\Model;
class Article extends Model
{
// 指定表名
protected $table = 'articles';
// 指定自动写入时间戳的字段
protected $autoWriteTimestamp = true;
}
```
3. 控制器实现分页查询
在应用的控制器中(例如application/controller/Index.php
),编写一个方法来处理分页查询的逻辑:
```php
<?php
namespace app\controller;
use app\BaseController;
use app\model\Article;
use think\facade\Request;
use think\facade\View;
use think\Response;
use think\Paginator;
class Index extends BaseController
{
public function index()
{
$title = Request::param('title'); // 获取请求中的标题参数
$keywords = Request::param('keywords'); // 获取请求中的关键词参数
$description = Request::param('description'); // 获取请求中的描述参数,虽然通常直接使用关键字就足够了,但为了示例完整性加入此项。
$page = Request::param('page', 1, 'intval'); // 获取当前页码,默认为第一页。
$limit = 10; // 每页显示的文章数量。
$searchFields = ['title', 'keywords', 'description']; // 需要搜索的字段数组。
$searchFieldsStr = implode(' OR ', arrayfill(0, count($searchFields), 'content LIKE CONCAT("%", ?, "%")')); // 构建搜索语句的占位符部分。
$searchValues = [$title . '%', $keywords . '%', $description . '%']; // 构建搜索值数组。对于text字段,我们需要使用'LIKE'和'CONCAT'进行模糊搜索。
$searchParams = arraycombine($searchFields, $searchValues); // 组合成用于搜索的参数数组。
$searchQuery = new Article(); // 创建Article模型的实例用于查询。
foreach ($searchFields as $field) { // 对每个搜索字段进行模糊查询。
$searchQuery->whereRaw(sprintf($searchFieldsStr, $field), $searchParams[$field]); // 添加到查询条件中。注意:这里的sql注入风险已在sprintf中通过数组键名控制,因此可安全执行。实际应用中请根据具体情况选择最安全的实现方式。
}
// 计算总记录数,用于分页计算。如果这里使用COUNT(*)会导致性能问题,可以改为COUNT(DISTINCT id)或使用其他优化手段,视情况而定。注意,这里的示例未考虑性能优化。
$total = $searchQuery->count(); // 总记录数,用于分页计算总页数。这里直接返回的是整个文章的行数,如果使用其他逻辑请相应调整分页逻辑中的计算方式。
// 分页处理和获取数据,由于原生的paginate不支持直接返回Markdown格式,这里仅做展示用示例代码。实际使用中需进一步处理输出格式。
$paginator = new Paginator($total, $limit, $page); // 创建分页对象
$data = $paginator->firstPageData(); // 获取第一页的数据
// 转换数据为Markdown格式输出,这里仅做演示:
foreach ($data as &$item) {
$item['content'] = Markdown::convertToHtml($item['content']); // 将文章正文转换为HTML格式的Markdown(此处需自行引入Markdown解析库)。
unset($item['id']); // 如果不需要显示ID字段,则将其从输出中移除
unset($item['create_time']); // 如果不需要显示创建时间字段,同样移除 } unset($item); return View::fetch('index', ['data' => $data]); // 返回模板渲染的数据 } } } ```