让复杂 SQL 不再复杂
composer require consatan/sqlbuilder虽然数据库操作类都支持多表关联查询,也支持纯 SQL 查询,但你是否遇到过复杂查询,又有多个判断条件的情况?
这个工具要解决的就是这类问题,如下(具体见 单元测试样例)
<?php
use Consatan\SQLBuilder\Bind;
use Consatan\SQLBuilder\Builder;
$sql = <<<SQL
SQL;
$builder = new Builder();
try {
$stmt = $builder
->build('')
->build('')
->build('')
->build('')
->run($dbh, $sql);
foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
// do something...
}
} catch (\InvalidArgumentException $e) {
// 参数错误才会抛出这个异常,理论上这个异常应该在测试阶段发现
} catch (\PDOException $e) {
// PDO 查询异常,必须捕获
}- useNamedPlaceholder = false 支持
- 根据
driver_options判断是否支持 named placeholders
[TOC]
Builder SQL 语句。
Consatan\SQLBuilder\Builder {
public __construct(array $config = [])]
public build(string $label, mixed $bind = [], string $sql = ''): Builder
public prepare(string $sql, mixed $bind = [], array $driverOptions = []): array
public run(\PDO $dbh, string $sql, mixed $bind = [], array $driverOptions = []): \PDOStatement
}实例化 Builder 类
public Builder::__construct(array $config = [])$config 支持以下实例化选项
allowBuildOverride: 是否允许覆盖 build,默认true。useNamedPlaceholder: 在 prepare SQL 时使用命名占位符,默认true。某些 PDO 驱动只支持问号形式的占位符,这种情况下需要手动配置该参数。该参数当前未实现。detectBindValueType: 根据 PHP 变量数据类型检测对应的 SQL 绑定参数类型,默认false。
成功返回 Consatan\SQLBuilder\Builder 实例。
build 一个 SQL-markup。
public Builder::build(string $label, mixed $bind = [], string $sql = ''): Builder$label SQL-markup 标签,允许的标签格式为 ``
$bind 绑定参数列表
$sql 传递该参数将覆盖 SQL-markup 中的内置 SQL 语句
返回当前 Consatan\SQLBuilder\Builder 实例,便于链式调用。
当参数格式错误时抛出 \InvalidArgumentException 异常。
对 builder 的 SQL 进行 prepare 化操作。
public Builder::prepare(string $sql, mixed $bind = [], array $driverOptions = []): array$sql 要执行的 SQL 语句。
$bind 绑定参数列表。
$driverOptions 参见 PDO::prepare 的 $driver_options 参数说明。
返回格式如下的数组
当参数错误时抛出 \InvalidArgumentException 异常。
执行 builder 的 SQL。
public Builder::run(\PDO $dbh, string $sql, mixed $bind = [], array $driverOptions = []): \PDOStatement$dbh PDO 实例。
$sql 见 Builder::prepare 的 $sql 参数说明。
$bind 见 Builder::prepare 的 $bind 参数说明。
$driverOptions 见 Builder::prepare 的 $driverOptions 参数说明。
成功返回 \PDOStatement 实例。
当参数错误时抛出 \InvalidArgumentException 异常。
PDO 绑定参数辅助类。
Consatan\SQLBuilder\Bind {
public getValues(): array
final public static int(mixed ...$bind): Bind
final public static str(mixed ...$bind): Bind
final public static null(mixed $val = null, mixed ...$bind): Bind
final public static bool(mixed ...$bind): Bind
final public static lob(mixed ...$bind): Bind
final public static assertBindValue(mixed $value): void
final public static assertArrayBindValue(array $array): void
final public static assertNamedPlaceholder(string $placeholder): void
final public static assertPDOParamType(int $type): void
}获取格式化后的 PDO 参数绑定数据
public Bind::getValues(): array格式化后的 PDO 参数绑定数据,格式如下
对给定数据进行 PDO int 数据类型绑定。
final public static Bind::int(mixed ...$bind): Bind...$bind
成功返回 Consatan\SQLBuilder\Bind 实例。
绑定参数值无效抛出 \InvalidArgumentException 异常。
对给定数据进行 PDO str 数据类型绑定。
final public static Bind::str(mixed ...$bind): Bind见 Bind::int 说明。
对给定数据进行 PDO null 数据类型绑定。
final public static Bind::null(mixed $val = null, mixed ...$bind): Bind$val
其余见 Bind::int 说明。
对给定数据进行 PDO bool 数据类型绑定。
final public static Bind::bool(mixed ...$bind): Bind见 Bind::int 说明。
对给定数据进行 PDO lob 数据类型绑定。
final public static Bind::lob(mixed ...$bind): Bind见 Bind::int 说明。
断言绑定参数是否合法。
final public static Bind::assertBindValue(mixed $bind): void$bind 要断言的绑定参数,必须是 scalar 或 null 数据类型。
绑定参数不合法抛出 \InvalidArgumentException 异常。
Array 版的 Bind::assertBindValue。
final public static Bind::assertArrayBindValue(array $array): void$array 要断言的绑定参数数组,数组元素必须是 scalar 或 null 数据类型。
绑定参数不合法抛出 \InvalidArgumentException 异常。
断言命名占位符格式。
final public static Bind::assertNamedPlaceholder(string $placeholder): void$placeholder 要断言的命名占位符变量。命名占位符必须符合以下格式。
命名占位符不合法抛出 \InvalidArgumentException 异常。
断言 PDO 参数绑定数据类型。
final public static Bind::assertPDOParamType(int $type): void$type 要断言的 PDO 参数绑定数据类型,详见
$type 为未定义的 PDO 参数绑定数据类型时抛出 \InvalidArgumentException 异常。