1. 分页 SQL
在 MySQL 中分页查询的 sql 语句是这样的:
css
SELECT * FROM `users`
LIMIT offset, pageSize;
其中最关键的偏移量: const offset = (current - 1) * pageSize
- current 当前页
- pageSize 每页显示的个数
2. sequelize 分页方法
sequelize 的分页方法是 findAndCountAll(condition)
其中参数 condition:
css
const condition = {
order: [['id', 'DESC']], // 按照id倒叙
limit: pageSize,
offset: offset
}
condition 中还可以添加过滤条件,例如:模糊查询
css
const condition = {
order: [['id', 'DESC']], // 按照id倒叙
limit: pageSize,
offset: offset,
where:{
name: {
[Op.like]: `%${query.name}%`
}
}
}
完整代码:
css
const express = require('express');
const router = express.Router();
const User = require("../models/user.js")
const { Op } = require('sequelize');
// 获取用户分页信息
router.get('/page', async (req, res) => {
try {
const query = req.query;
// 当前页
const current = Number(query.current) || 1
// 每页个数
const pageSize = Number(query.pageSize) || 10
// 偏移
const offset = (current - 1) * pageSize
// 条件
const condition = {
order: [['id', 'DESC']], // 按照id倒叙
limit: pageSize,
offset: offset
}
if (query.name) {
condition.where = {
name: {
[Op.like]: `%${query.name}%`
}
}
}
// 分页查询
const { count, rows } = await User.findAndCountAll(condition);
// 封装查询数据
const data = {
rows,
pagination: {
total: count,
current,
pageSize
}
}
// 返回
res.status(200).json({
code: 200,
message: "查询成功",
data
});
} catch (err) {
res.status(500).json({ error: err.message });
}
});
module.exports = router;