在ThinkPHP框架的日常开发中,数据库查询是操作业务数据的核心步骤,框架提供了多种不同的查询方式,适配不同的开发场景和开发者的使用习惯。目前ThinkPHP主流的查询方式主要分为四种,分别是原生SQL查询、数据库类链式查询、模型查询和查询构造器查询,下面逐一介绍每种查询的具体用法。

一、原生SQL查询
原生SQL查询是直接编写SQL语句执行查询的方式,适合处理复杂的联表查询、聚合查询等场景,当需要执行框架封装的查询方法无法覆盖的SQL逻辑时可以使用这种方式。ThinkPHP提供了query方法执行查询操作,execute方法执行写入、更新、删除操作。
<?php
namespace appcontroller;
use thinkfacadeDb;
class UserController
{
// 原生查询获取用户列表
public function getList()
{
// 查询操作使用query方法
$list = Db::query("SELECT id, username FROM user WHERE status = 1 LIMIT 10");
// 写入操作使用execute方法,返回影响行数
$insertId = Db::execute("INSERT INTO user (username, password) VALUES ('test', '123456')");
return json($list);
}
}
二、数据库类链式查询
链式查询是ThinkPHP最常用的查询方式之一,通过调用数据库类的一系列方法拼接查询条件,最终调用查询方法获取结果,代码可读性高,适合大多数常规查询场景。常用的链式方法包括where、field、order、limit等。
<?php
namespace appcontroller;
use thinkfacadeDb;
class UserController
{
// 链式查询获取状态为1的用户列表
public function getList()
{
$list = Db::name('user') // 指定数据表,无需写表前缀
->field('id, username, create_time') // 指定查询字段
->where('status', 1) // 查询条件
->order('create_time', 'desc') // 排序规则
->limit(10) // 限制查询条数
->select(); // 执行查询,返回数据集
return json($list);
}
}
三、模型查询
模型查询是基于ThinkPHP的模型类实现的查询方式,模型类和数据表绑定,封装了表相关的逻辑,适合在MVC架构的模型层使用,能够更好的实现业务逻辑封装和代码复用。使用模型查询前需要先定义对应的模型类。
<?php
// 先定义User模型类,路径app/model/User.php
namespace appmodel;
use thinkModel;
class User extends Model
{
// 指定数据表名,若表名符合规范可省略
protected $table = 'user';
}
// 控制器中使用模型查询
namespace appcontroller;
use appmodelUser;
class UserController
{
public function getList()
{
// 模型查询,调用模型的方法获取结果
$list = User::where('status', 1)
->field('id, username')
->order('id', 'asc')
->select();
// 也可以使用模型的静态查询方法
$user = User::find(1); // 查询主键为1的记录
return json($list);
}
}
四、查询构造器查询
查询构造器是ThinkPHP提供的一套查询构建工具,本质上和链式查询的逻辑类似,但是支持更灵活的查询条件构建,比如动态拼接条件、构建复杂的where逻辑等,适合需要根据不同参数动态生成查询条件的场景。
<?php
namespace appcontroller;
use thinkfacadeDb;
class UserController
{
public function getList($username = '', $status = null)
{
$query = Db::name('user');
// 动态拼接查询条件
if (!empty($username)) {
$query->whereLike('username', '%' . $username . '%');
}
if (!is_null($status)) {
$query->where('status', $status);
}
$list = $query->order('id', 'desc')->paginate(10); // 分页查询
return json($list);
}
}
不同查询方式的对比
为了帮助开发者选择合适的查询方式,下面通过表格对比四种查询的特点:
| 查询方式 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| 原生SQL查询 | 复杂SQL逻辑、框架方法无法覆盖的查询 | 灵活度高,可编写任意SQL | 可读性较差,容易出现SQL注入风险 |
| 链式查询 | 常规简单查询、快速开发 | 代码简洁,可读性好,无需定义模型 | 复杂条件拼接不够灵活 |
| 模型查询 | MVC架构开发、业务逻辑封装 | 封装性好,支持模型关联、事件等特性 | 需要提前定义模型类,简单查询略显繁琐 |
| 查询构造器查询 | 动态条件查询、复杂条件拼接 | 条件拼接灵活,适配多参数查询场景 | 和链式查询差异较小,学习成本略高 |
实际开发中可以根据具体需求选择对应的查询方式,常规简单查询优先使用链式查询或者模型查询,复杂SQL场景使用原生查询,需要动态拼接条件时选择查询构造器即可。