ThinkPHP6.x查询构造器:使用链式操作轻松实现数据表的基础增删改查

酷伟小哥_3144

酷伟小哥_3144

2026-06-01

359人浏览

原创

db类操作需注意:find()返回单条(数组/null),select()返回数据集对象;save()仅模型可用,db需用insert/update;推荐name()自动处理前缀;原生sql用query()/execute(),链式操作须在find/select前完成。

thinkphp6.x查询构造器:使用链式操作轻松实现数据表的基础增删改查

直接用 Db 类做增删改查,不写 SQL 也能跑通,但容易在 find 和 select 返回值类型、空结果处理、主键识别逻辑上出错——尤其当你混用 save 和 insert 时。

find() 和 select() 的返回值差异必须分清

find() 返回单条记录(数组或 null),select() 返回数据集对象(可调用 toArray() 转数组,但默认不是数组)。很多人直接 foreach($res) 却没检查 $res 是不是对象,结果报错。

  • find() 查不到数据时返回 null,想返回空数组用 findOrEmpty()
  • select() 查不到时返回空数据集对象(count($res) === 0),不是空数组;要转数组必须显式调用 toArray()
  • 想查不到就抛异常?用 findOrFail() 或 selectOrFail(),别自己写 if (!$res) throw new Exception(...)
  • where 条件缺失时,find() 会返回表第一条数据(不加 limit 1),而 select() 默认查全表——这点常被忽略

save() 不是 insert(),主键字段决定行为

save() 是模型级方法,它根据数据中是否含主键值(如 id)自动判断走新增还是更新。但用 Db::table()->save() 会报错:这个方法只在模型实例上可用,Db 查询器没有 save()。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 正确姿势:用 Db::table('user')->insert($data) 新增,Db::table('user')->where('id', 1)->update($data) 更新
  • 若要用 save(),必须基于模型,比如 User::create($data)(新增)或 User::find(1)->save($data)(更新)
  • insert() 成功返回插入行数(通常是 1),update() 返回影响行数,别拿它当布尔值判断成败
  • 批量插入用 insertAll(),别循环调 insert(),性能差且事务难控制

用 name() 还是 table()?前缀配置决定实际行为

Db::name('user') 会自动拼上前缀(如 think_),Db::table('user') 则按字面名查表。如果数据库表没加前缀,两者效果一样;但一旦配置了 'prefix' => 'think_',table('user') 就会去查 user 表(不存在),而 name('user') 查的是 think_user。

  • 推荐统一用 name(),和模型层命名习惯一致,也避免手动拼接前缀出错
  • name() 只能用于当前连接的默认前缀配置,跨库或动态前缀场景仍得用 table() + 完整表名
  • 查不到数据时,先用 Db::getLastSql() 打印真实 SQL,确认表名、字段、条件是否被正确解析

原生 SQL 执行必须用 query()/execute(),不能混进链式查询

Db::query() 专用于 SELECT,Db::execute() 用于 INSERT/UPDATE/DELETE。它们不支持链式调用,参数必须是完整 SQL 字符串 + 绑定数组。有人试图写 Db::table('user')->query($sql),这会报错。

  • 需要复杂 JOIN 或函数计算时,优先用原生 SQL,别硬套链式查询
  • 参数绑定用 : 占位符(如 :id),不要拼字符串,防注入
  • 执行后想取自增 ID?insertGetId() 是唯一可靠方式,execute() 返回的是影响行数,不是 ID
  • 事务中混合使用原生 SQL 和链式操作时,确保都在同一连接内,否则可能漏提交

最易被绕开的一点:所有链式操作(where、order、limit)必须在 find() 或 select() 前完成,调完之后再链式是无效的——TP 不会缓存中间状态,也不会报错,只会静默忽略。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9684

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5821

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2055

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3628

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4314

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3391

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4817

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3762

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11762

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习