bloatless/query-builder

PDO MySQL 的查询构建器。

v1.0.0 2022-01-02 18:24 UTC

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();
连接

您可以使用 joinleftJoinrightJoin 方法来连接表。您当然可以连接多个表。

$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

您可以在所有 selectupdatedelete 查询上使用各种 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