ThinkPHP模型查询和Db查询有什么区别?
模型查询封装了orm逻辑,自动处理表名、主键、软删除和数据过滤,适合业务对象操作;db查询是底层链式调用,直接映射sql,无额外逻辑开销,适合复杂统计或临时脚本。两者核心区别在于是否启用数据自动处理机制。

什么时候不该用模型?
当需要执行非标准SQL(如存储过程调用)、高频批量写入(需关闭事务自动提交)、或涉及跨库/跨实例查询时,不应使用模型。此外,在纯报表统计且字段计算极其复杂时,Db查询能避免ORM转换带来的性能损耗。

基于程序中某个输入、条件或结果的具体问题
在ThinkPHP 6中,若对同一张表同时使用Model::where()和Db::name()查询,且该表配置了全局作用域(如软删除),模型会自动附加过滤条件,而Db查询默认不会。这一差异会导致数据结果不一致,需在代码中显式处理。
立即学习“PHP免费学习笔记(深入)”;
namespace app\controller;
use think\facade\Db;
use app\model\User;
class Index
{
public function index()
{
// 假设 User 模型定义了全局作用域:只查询 is_delete = 0 的数据
// 1. 模型查询:自动应用全局作用域
$modelResult = User::where('id', 1)->find();
// 2. Db查询:不自动应用全局作用域,除非手动添加
$dbResult = Db::name('user')->where('id', 1)->find();
// 3. 强制模型忽略作用域
$ignoreResult = User::withoutGlobalScope()->where('id', 1)->find();
return json([
'model' => $modelResult,
'db' => $dbResult,
'ignore' => $ignoreResult
]);
}
}
预期结果说明:
- $modelResult:若用户ID为1且已软删除,返回null。
- $dbResult:无论是否软删除,均返回该条记录(包括已删除的)。
- $ignoreResult:行为同$dbResult,但通过模型API获取。
此示例验证了模型与Db在作用域处理上的关键差异。开发者在使用模型时应注意全局作用域的隐式影响,而在需要原始数据访问时,Db查询提供了更可控的路径。



















