PhpBoot DB 查询构建器完全指南:8 个技巧让你写出优雅高效的 SQL
【免费下载链接】phpboot:coffee: 🚀 tiny & fast PHP framework for building Microservices/RESTful APIs, with useful features: IOC, Hook, ORM, RPC, Swagger, Annotation, Parameters binding, Validation, etc.项目地址: https://gitcode.com/gh_mirrors/ph/phpboot
PhpBoot 是一个轻量级的 PHP 框架,专门用于快速构建微服务与 RESTful API。它内置了一套强大的PhpBoot DB 查询构建器(Query Builder),让你无需手写繁琐的 SQL 拼接,就能用流畅的链式方法完成增删改查,同时天然规避 SQL 注入风险。本文为你整理 8 个实用技巧,从连接配置到事务锁,帮你快速上手这套查询构建器,写出优雅高效的 SQL。
1. 技巧一:用依赖注入三步配置数据库连接
PhpBoot 的查询构建器入口是 DB.php 中的DB::connect(),它封装了 PDO 并默认开启异常模式、UTF-8 字符集。配置非常简单,只需三步:
- 在类中通过
@inject注入DB实例(需引入PhpBoot\DI\Traits\EnableDIAnnotations); - 在
config.php中填写DB.connection、DB.username、DB.password等配置项; - 业务代码里直接
$this->db->select(...)即可。
更详细的配置过程可参考官方文档 docs/basic/db.md。如果项目需要同时连接多个数据库,还可以借助依赖注入为不同连接定义独立的配置项,一个类里注入多个DB实例。
2. 技巧二:链式调用写出优雅的 SELECT 查询
查询构建器最大的魅力在于链式调用。一条复杂的查询,用几行流畅的方法就能表达:
$books = $this->db->select('*') ->from('books') ->where('name LIKE ?', "%$name%") ->orderBy('id', DB::ORDER_BY_DESC) ->limit($offset, $limit) ->get();这段代码等价于SELECT * FROM books WHERE name LIKE ? ORDER BY id DESC LIMIT ?,?,但所有变量都会经过预处理绑定,既安全又清晰。SELECT 的完整方法链定义在 select.php 中,支持join、groupBy、having、forUpdate等,几乎覆盖了日常所有场景。
3. 技巧三:用数组条件实现 IN、BETWEEN、LIKE
除了字符串条件,查询构建器还支持类似 MongoDB 的数组条件语法,让复杂的过滤条件一目了然:
->where([ 'status' => 1, 'price' => ['BETWEEN' => [100, 500]], 'name' => ['LIKE' => 'PHP%'], 'id' => ['IN' => [1, 2, 3]], ])支持的运算符包括=、>、<、<>、>=、<=、IN、NOT IN、BETWEEN、LIKE,具体实现见 impls.php。数组条件会自动用AND连接,多个条件组合时代码可读性远高于拼接字符串。
4. 技巧四:告别 PDO 的 IN 占位符噩梦
用过 PDO 的人都知道,WHERE IN (?,?,?)需要动态生成与元素数量相等的占位符,非常麻烦。PhpBoot 查询构建器帮你自动展开了数组:
$db->select()->from('table')->where('a IN (?)', [1, 2, 3]);你只需写一个?,框架会在底层把它展开为a IN (?,?,?)并依次绑定参数(见 impls.php 中的自动展开逻辑)。这一细节能显著减少手写 SQL 时容易犯的低级错误。
5. 技巧五:用 ScopedQuery 处理复杂嵌套条件
遇到a=1 OR (b=2 AND c=3)这种带括号的复杂条件,普通字符串拼接很容易出错。查询构建器提供了ScopedQuery闭包来实现嵌套:
->where(['a' => 1]) ->orWhere(function (ScopedQuery $query) { $query->where(['b' => 2, 'c' => 3]); })闭包内部还能继续嵌套,逻辑边界清晰,对应实现位于 basic.php。
6. 技巧六:JOIN 联表查询与子查询
联表查询同样是链式完成:
$db->select('books.*', DB::raw('authors.name as author')) ->from('books') ->leftJoin('authors')->on('books.authorId = authors.id') ->get();支持join、leftJoin、rightJoin、innerJoin四种方式。更有趣的是,子查询也能直接作为 FROM 表使用:
$parent = $db->select()->from('table1')->where('a=1'); $child = $db->select()->from($parent);框架会自动生成SELECT * FROM (SELECT * FROM table1 WHERE a=1),代码示例见 docs/basic/db.md。
7. 技巧七:INSERT、UPDATE、DELETE 与批量写入
增删改的方法同样简洁。插入后还能直接拿到自增 ID:
$newId = $this->db->insertInto('books') ->values(['name' => $book->name, 'brief' => $book->brief]) ->exec()->lastInsertId();批量插入用batchValues()一行搞定;遇到唯一键冲突时,还可以用onDuplicateKeyUpdate()实现"存在则更新"的 upsert 语义(见 insert.php)。更新和删除则是熟悉的链式写法:
$this->db->update('books')->set(['name' => $book->name])->where(['id' => $book->id])->exec(); $this->db->deleteFrom('books')->where(['id' => $id])->exec();8. 技巧八:用事务、锁和 count 保证数据一致
当多个操作需要原子执行时,transaction()方法接收一个闭包,异常时自动回滚,且支持事务嵌套(只有最外层事务真正生效):
$db->transaction(function (DB $db) { $db->update('accounts')->set(['balance' => 100])->where(['id' => 1])->exec(); $db->update('accounts')->set(['balance' => 0])->where(['id' => 2])->exec(); });对并发敏感的查询还可以加锁:->forUpdate()->of('balance')。此外,getFirst()取单条、get('id')以指定字段为键返回字典、count()自动生成COUNT(*)统计总数,这些常用方法都定义在 select.php,配合分页接口非常顺手。
总结
PhpBoot DB 查询构建器把 PDO 的繁琐细节封装得恰到好处:自动转义、自动绑定参数、自动展开 IN 数组、嵌套条件、事务与锁一应俱全。掌握以上 8 个技巧,你就能告别手拼 SQL 的日子,写出安全、优雅、易维护的数据库操作代码。想深入了解完整 API,可以翻阅源码中的 DB.php、impls.php 以及官方文档 docs/basic/db.md。
【免费下载链接】phpboot:coffee: 🚀 tiny & fast PHP framework for building Microservices/RESTful APIs, with useful features: IOC, Hook, ORM, RPC, Swagger, Annotation, Parameters binding, Validation, etc.项目地址: https://gitcode.com/gh_mirrors/ph/phpboot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考