thinkphp orm 分页查询
时间: 2025-07-16 16:06:12 AIGC 浏览: 18 评论: 7
<think>我们正在使用ThinkPHP ORM进行分页查询,需要根据前端传入的参数动态构建查询条件。如果没有传入参数,则查询所有数据。
关键点:
1. 使用ThinkPHP的ORM(模型)进行查询。
2. 动态构建条件:根据前端传递的参数(如GET参数)来添加where条件。
3. 分页:使用paginate方法进行分页。
步骤:
1. 获取前端参数(使用Request对象)。
2. 初始化一个空的条件数组。
3. 判断每个参数是否存在且不为空,然后构建相应的条件。
4. 使用模型(或Db类)的where方法,但注意条件数组为空时则查询全部。
5. 使用paginate进行分页。
注意:ThinkPHP 6.x 中,我们可以使用`when`方法来实现条件查询,也可以直接判断条件数组是否为空。
参考用户之前的问题,我们已经有一个基本的实现。现在结合分页,我们可以这样写:
控制器代码示例:</think>### ThinkPHP ORM 分页查询动态条件实现方案
在 ThinkPHP 中使用 ORM 实现带动态条件的分页查询(无参数时查询所有数据),核心是通过 `when()` 方法动态构建查询条件。以下是完整实现:
---
### 一、控制器实现代码
```php
namespace app\controller;
use think\Request;
use think\facade\Db;
use app\model\User; // 替换为你的模型
class UserController
{
public function index(Request $request)
{
// 1. 获取前端查询参数
$params = $request->get();
// 2. 动态构建查询条件
$query = User::where('status', 1); // 基础条件(如状态过滤)
// 3. 根据参数动态添加条件
$query->when(!empty($params['name']), function ($q) use ($params) {
$q->where('name', 'like', '%' . $params['name'] . '%');
})->when(isset($params['status']) && $params['status'] !== '', function ($q) use ($params) {
$q->where('status', $params['status']);
})->when(!empty($params['start_time']) && !empty($params['end_time']), function ($q) use ($params) {
$q->whereBetweenTime('create_time', $params['start_time'], $params['end_time']);
});
// 4. 执行分页查询
$list = $query->order('id', 'desc')
->paginate([
'list_rows' => 10, // 每页数量
'query' => $params // 保留分页参数
]);
return view('index', ['list' => $list]);
}
}
```
---
### 二、关键实现说明
#### 1. 动态条件构建
使用 `when()` 方法实现条件判断:
```php
->when(条件, 回调函数)
```
- 条件为真时执行回调函数添加查询条件
- 条件为假时跳过该条件
- **无参数时**:所有 `when()` 条件都不触发,返回全部数据
#### 2. 安全注意事项
```php
// 精确匹配需验证空值
->when(isset($params['status']) && $params['status'] !== '', ...)
// 模糊查询防 SQL 注入
->where('name', 'like', '%' . Db::raw($params['name']) . '%')
```
#### 3. 分页参数处理
```php
->paginate([
'list_rows' => 10,
'query' => $params // 保留URL参数
]);
```
- `query` 参数确保分页链接携带原始查询条件
---
### 三、视图层展示(HTML)
```html
<!-- 搜索表单 -->
<form action="/user" method="get">
<input type="text" name="name" placeholder="姓名">
<select name="status">
<option value="">全部状态</option>
<option value="1">启用</option>
<option value="0">禁用</option>
</select>
<button type="submit">搜索</button>
</form>
<!-- 数据表格 -->
<table>
{volist name="list" id="user"}
<tr>
<td>{$user.name}</td>
<td>{$user.status|getStatus}</td>
</tr>
{/volist}
</table>
<!-- 分页控件 -->
<div class="pagination">{$list|raw}</div>
```
---
### 四、最佳实践建议
1. **参数过滤**
使用验证器过滤危险参数:
```php
$data = $request->only(['name', 'status', 'start_time', 'end_time']);
```
2. **空值处理技巧**
```php
// 使用 null 合并运算符简化代码
->when($params['status'] ?? false, fn($q, $v) => $q->where('status', $v))
```
3. **复杂条件处理**
```php
// OR 条件查询
->when(!empty($params['keyword']), function ($q) use ($params) {
$q->whereOr('name|email', 'like', "%{$params['keyword']}%");
})
```
4. **关联模型查询**
```php
User::with('profile')
->when(...)
->paginate(10);
```
---
### 五、执行效果
1. **带参数请求**
`GET /user?name=张&status=1`
生成 SQL:
```sql
SELECT * FROM `user`
WHERE status = 1
AND name LIKE '%张%'
ORDER BY id DESC
LIMIT 0,10
```
2. **无参数请求**
`GET /user`
生成 SQL:
```sql
SELECT * FROM `user`
WHERE status = 1
ORDER BY id DESC
LIMIT 0,10
```
---
### 六、自定义分页样式
参考 Bootstrap 样式修改分页模板(`config/paginate.php`):
```php
return [
'type' => 'bootstrap',
'var_page' => 'page',
'list_rows' => 15,
];
```
在视图模板中使用:
```html
<!-- 渲染分页 -->
<div class="pagination">{$list->render()}</div>
```
效果:
```html
<ul class="pagination">
<li class="page-item"><a class="page-link" href="/user?page=1">1</a></li>
<li class="page-item active"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="/user?page=3">3</a></li>
</ul>
```
> **提示**:此方案在 ThinkPHP 6.x/8.x 通用,核心是链式调用 `when()` 方法实现动态条件过滤[^1][^2],结合 ORM 的分页功能实现优雅查询[^3]。
阅读全文
相关推荐





















评论

英次
2025.08.20
最佳实践建议为开发者提供了优化方向。

图像车间
2025.08.02
提供了丰富的查询场景和安全处理建议。🍛

优游的鱼
2025.07.05
自定义分页样式,提升用户体验。

型爷
2025.06.13
ThinkPHP ORM分页查询示例详尽,适合初学者。

创业青年骁哥
2025.06.06
代码示例清晰,易于理解和应用。

ask_ai_app
2025.05.08
执行效果部分,通过SQL示例帮助理解。

张匡龙
2025.05.05
动态条件构建与分页功能结合紧密,实现高效。