bloatless / query-builder
PDO MySQL 的查询构建器。
Requires
- php: ^8.0
- ext-pdo: *
Requires (Dev)
- phpunit/phpunit: ^8.3
This package is not auto-updated.
Last update: 2024-09-24 07:37:24 UTC
README
Bloatless 查询构建器
适用于 PDO MySQL 和 SQLite 的查询构建器。
安装
使用 Phar
从 发布页面 下载最新的 Phar,并在项目中像其他 PHP 类一样包含/使用库
require_once '/path/to/query-builder.phar'; $factory = new \Bloatless\QueryBuilder\QueryBuilderFactory($myConfig); $queryBuilder = $factory->make();
使用 composer
您可以使用 composer 安装库
composer require bloatless/query-builder
手动
将 GitHub 中的文件克隆或下载到您的本地项目中。然后您可以在项目中包含/使用库
require_once '/path/to/src/QueryBuilderFactory.php'; $factory = new \Bloatless\QueryBuilder\QueryBuilderFactory($myConfig); $queryBuilder = $factory->make();
用法
查询构建器
本文档解释了 Bloatless 查询构建器的完整用法 API。
连接
您可以在项目的 config.php
文件中定义多个数据库连接。
$config = [ 'db' => [ 'connections' => [ 'db1' => [ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'db1', 'username' => 'root', 'password' => 'your-password', 'charset' => 'utf8', // Optional 'timezone' => 'Europe/Berlin', // Optional ], 'db2' => [ 'driver' => 'sqlite', 'database' => '/path/to/sqlite.db', ] // add additional connections here... ], 'default_connection' => 'db1', ] ];
工厂
QueryBuilder 工厂需要使用提供连接凭据的配置数组进行初始化
$db = new \Bloatless\QueryBuilder\QueryBuilder\Factory($config['db']);
初始化后,工厂可用于为各种数据库操作提供查询构建器对象
$selectQueryBuilder = $db->makeSelect(); $updateQueryBuilder = $db->makeUpdate(); $deleteQueryBuilder = $db->makeDelete(); $insertQueryBuilder = $db->makeInsert(); $rawQueryBuilder = $db->makeRaw();
如果没有提供参数,则使用默认数据库连接。如果您想使用不同的连接,可以传递连接名称作为参数。
$updateQueryBuilder = $db->makeUpdate('db2');
SELECT
简单的选择
$rows = $db->makeSelect()->from('customers')->get();
表和列别名
别名可以用于表名以及列名。
$rows = $db->makeSelect() ->cols(['customer_id AS id', 'firstname', 'lastname']) ->from('customers AS c') ->get();
获取特定列
$rows = $db->makeSelect() ->cols(['customer_id', 'firstname', 'lastname']) ->from('customers') ->get();
只获取第一行
$row = $db->makeSelect() ->from('customers') ->whereEquals('customer_id', 42) ->first();
单个列作为数组
$names = $db->makeSelect() ->from('customers') ->pluck('firstname');
将获取包含所有客户表中首字母的数组。
您还可以指定第二个列,它将用作数组的键
$names = $db->makeSelect() ->from('customers') ->pluck('firstname', 'customer_id');
将获取使用 customer_id
作为数组键的所有首字母的数组。
计数行
$rowCount = $db->makeSelect() ->from('customers') ->count();
连接
您可以使用 join
、leftJoin
或 rightJoin
方法来连接表。您当然可以连接多个表。
$rows = $db->makeSelect() ->from('customers') ->join('orders', 'customers.customer_id', '=', 'orders.customer_id') ->get();
按组
$rows = $db->makeSelect() ->from('orders') ->groupBy('customer_id') ->get();
按顺序
$rows = $db->makeSelect() ->from('customers') ->orderBy('firstname', 'desc') ->get();
HAVING
$rows = $db->makeSelect() ->from('orders') ->having('amount', '>', 10) ->orHaving('cart_items', '>' 5) ->get();
限制和偏移量
$rows = $db->makeSelect() ->from('orders') ->limit(10) ->offset(20) ->get();
distinct
$rows = $db->makeSelect() ->distinct() ->from('orders') ->get();
UPDATE
$rows = $db->makeUpdate() ->table('customers') ->whereEquals('customer_id', 42) ->update([ 'firstname' => 'Homer' ]);
DELETE
$rows = $db->makeDelete() ->from('customers') ->whereEquals('customer_id', 42) ->delete();
WHERE
您可以在所有 select
、update
和 delete
查询上使用各种 WHERE 子句
简单 WHERE
$rows = $db->makeSelect() ->from('customers') ->where('customer_id', '=', 42) ->where('customer_id', '>', 10) ->whereEquals('customer_id', 42) ->get();
或 WHERE
->orWhere('customer_id', '>', 5)
WHERE IN
->whereIn('customer_id', [1,2,3])
WHERE NOT IN
->whereNotIn('customer_id', [1,2,3])
或 WHERE IN
->orWhereIn('customer_id', [1,2,3])
或 WHERE NOT IN
->orWhereNotIn('customer_id', [1,2,3])
WHERE BETWEEN
->whereBetween('customer_id', 5, 10)
或 WHERE BETWEEN
->orWhereBetween('customer_id', 5, 10)
WHERE NULL
->whereNull('customer_id')
WHERE NOT NULL
->whereNotNull('customer_id')
或 WHERE NULL
->orWhereNull('customer_id')
或 WHERE NOT NULL
->orWhereNotNull('customer_id')
WHERE 原始
->whereRaw('TIMESTAMPDIFF(HOUR, `time`, NOW()) <= 24') ->whereRaw('customer_id = :id', ['id' => 10])
或 WHERE 原始
->orWhereRaw('TIMESTAMPDIFF(HOUR, `time`, NOW()) <= 24')
INSERT
单行
$customerId = $db->makeInsert() ->into('customers') ->row([ 'firstname' => 'Homer', 'lastname' => 'Simpson', ]);
在插入单行时,新添加行的自增值将被返回。
多行
您可以使用 rows
方法一次插入多行
$db->makeInsert() ->into('customers') ->rows([ [ 'firstname' => 'Homer', 'lastname' => 'Simpson', ], [ 'firstname' => 'Marge', 'lastname' => 'Simpson', ], ]);
最后插入 ID
如果您需要手动获取最后插入的 ID,可以使用 getLastInsertId
方法
$id = $insertQueryBuilder->getLastInsertId();
原始查询
总会有一些查询您无法使用查询构建器的这些方法来构建。在这种情况下,您可以使用 RawQueryBuilder
,它允许您执行对数据库的原始查询。
原始选择查询
$rows = $db->makeRaw() ->prepare("SELECT * FROM `orders` WHERE `customer_id` = :id", [ 'id' => 42, ]) ->get();
其他原始查询
$db->makeRaw() ->prepare("UPDATE `customers` SET `firstname` = :name WHERE `customer_id` = :id", [ 'name' => 'Homer', 'id' => 42, ]) ->run();
重置
所有查询构建器都有一个 reset
方法。此方法可以用来清除先前设置的值,而无需创建新的 QueryBuilder 对象。
$builder = $db->makeSelect() ->from('customers') ->whereEquals('customer_id', 42); $builder->reset(); ...
安全
所有查询构建器内部都使用PDO参数绑定,以尽可能减少注入攻击的风险。此外,表名以及字段名都被引号括起来——因此你不必担心这一点。这在简单的表名或使用别名时都适用。尽管如此,你应始终尝试避免在SQL语句中使用用户输入!
许可证
MIT