grantjm9992 / fluentpdo
FluentPDO 是一个快速且轻量级的 PHP 库,用于快速构建查询。它具有智能连接构建器,可以自动创建表连接。
Requires
- php: ^7.1
- ext-pdo: *
Requires (Dev)
- envms/fluent-test: ^1.0
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-05 22:32:28 UTC
README
FluentPDO 是一个使用 PDO 的 PHP SQL 查询构建库。它是一个快速且轻量级的库,具有智能连接构建器,可以自动为您创建表连接。
特点
- 创建强大查询的简单接口
- 支持任何与 PDO 兼容的数据库
- 使用少量代码构建复杂的 SELECT、INSERT、UPDATE 和 DELETE 查询
- 对魔法方法进行类型提示,在智能 IDE 中进行代码补全
版本
版本 2.x
FluentPDO 的稳定版本,正在积极维护。官方支持 PHP 7.3 到 PHP 8.0,但也可以与之前的 PHP 7 版本一起使用。
版本 1.x
FluentPDO 的旧版本。它不再受支持,也不会维护或更新。此版本适用于 PHP 5.4 到 7.1。
版本 3.x - alpha
此版本是从头开始完全重写的 Fluent。其主要优点是显著降低内存使用量,在查询构建方面性能大幅提升。它还添加了一些额外的限制,以便使查询更容易阅读和维护。文档也是一个非常普遍的需求,版本 3 正在与开发同步进行完全文档化。详细信息将一有可公开的信息即发布。
参考
安装
Composer
安装 FluentPDO 的首选方法是使用 composer。
在您的 composer.json
文件中添加以下行
"require": {
...
"envms/fluentpdo": "^2.2.0"
}
使用 composer update
更新依赖项,然后您就完成了!
下载 Zip
如果您不想使用 composer,请下载最新版本,在您的库目录中创建 Envms/FluentPDO
目录,并将此存储库放入其中。最后,将
require "[lib-dir]/Envms/FluentPDO/src/Query.php";
添加到您的应用程序顶部。注意:您将需要一个自动加载器才能在不更改 FluentPDO 源代码的情况下使用 FluentPDO。
入门指南
创建一个新的 PDO 实例,并将该实例传递给 FluentPDO
$pdo = new PDO("mysql:dbname=fluentdb", "root"); $fluent = new \Envms\FluentPDO\Query($pdo);
然后,创建查询变得快速且简单
$query = $fluent->from('comment') ->where('article.published_at > ?', $date) ->orderBy('published_at DESC') ->limit(5);
这将构建以下查询
SELECT comment.* FROM comment LEFT JOIN article ON article.id = comment.article_id WHERE article.published_at > ? ORDER BY article.published_at DESC LIMIT 5
要从选择中获取数据,我们只需遍历返回的数组即可
foreach ($query as $row) { echo "$row[title]\n"; }
联合查询
在 SELECT 查询中使用联合,有两种不同的可能性
第一种是在构建器上直接使用 union 函数
$query = $fluent->from('table_1') ->union('table_2') ->union('table_3');
这将返回以下查询
SELECT * FROM table_1 UNION SELECT * FROM table_2 UNION SELECT * FROM table_3
另一种选择是使用 unifiedTables 函数而不是 from 函数
$query = $fluent->unifiedTables(['table_1', 'table_2', 'table_3'], '_table') ->orderBy('first_name ASC') ->where('first_name LIKE "%test%"');
这将返回以下查询
SELECT _table.* FROM ( SELECT * FROM table_1 UNION SELECT * FROM table_2 UNION SELECT * FROM table_3 ) AS _table WHERE first_name LIKE '%test%' ORDER BY first_name ASC
使用智能连接构建器
让我们从一个传统的连接开始
$query = $fluent->from('article') ->leftJoin('user ON user.id = article.user_id') ->select('user.name');
这相当冗长,而且不够智能。如果您的表使用适当的主键和外键名称,您可以简化上面的代码
$query = $fluent->from('article') ->leftJoin('user') ->select('user.name');
这更好,但还不是最佳选择。然而,最简单的方法是不写任何连接
$query = $fluent->from('article') ->select('user.name');
太棒了,FluentPDO 可以通过您将外键表名称添加到请求的列之前为您构建连接
上述三个代码片段都将创建完全相同的查询
SELECT article.*, user.name FROM article LEFT JOIN user ON user.id = article.user_id
关闭您的连接
最后,当资源完成其任务后,立即释放资源总是一个好主意
$fluent->close();
CRUD 查询示例
SELECT
$query = $fluent->from('article')->where('id', 1)->fetch(); $query = $fluent->from('user', 1)->fetch(); // shorter version if selecting one row by primary key
INSERT
$values = array('title' => 'article 1', 'content' => 'content 1'); $query = $fluent->insertInto('article')->values($values)->execute(); $query = $fluent->insertInto('article', $values)->execute(); // shorter version
UPDATE
$set = array('published_at' => new FluentLiteral('NOW()')); $query = $fluent->update('article')->set($set)->where('id', 1)->execute(); $query = $fluent->update('article', $set, 1)->execute(); // shorter version if updating one row by primary key
DELETE
$query = $fluent->deleteFrom('article')->where('id', 1)->execute(); $query = $fluent->deleteFrom('article', 1)->execute(); // shorter version if deleting one row by primary key
注意:INSERT、UPDATE 和 DELETE 查询将在您调用 ->execute()
后运行
完整的文档可以在FluentPDO 主页找到。
许可协议
根据Apache 2.0或GPL 2.0许可证,允许商业和非商业用途。