hschletz / nada
NADA 是一个针对 PHP 的高层次 SQL 抽象库,它补充并作用于传统的数据库抽象层之上
Requires
- php: ^7.4 || ^8.0 || ^8.1 || ^8.2 || ^8.3
README
关于 NADA
NADA 是一个针对 PHP 的高层次 SQL 抽象库。它补充并作用于传统的数据库抽象层之上(目前支持:PDO 和 laminas-db),使得它能够轻松集成到现有应用程序中。
NADA 为不同的数据库后端提供了 SQL 抽象方法(目前支持:PostgreSQL、MySQL/MariaDB 和 SQLite),这些方法在典型的数据库抽象层中是不可用的,这些抽象层通常只提供一个统一的数据库连接接口。相比之下,NADA 提供了对某些 SQL 操作的统一接口,这些操作在没有 NADA 的情况下可能需要在代码中采用 DBMS 特定的解决方案。
- 查询和更改数据库结构(表、列、数据类型、视图)
- 生成不可移植函数的 SQL 代码片段
- 设置兼容性标志以强制执行可预测、符合标准的行为
一些数据库抽象层已经提供了一些高级功能,但这些功能与它们的数据库连接方法紧密耦合。要使用这些功能,整个应用程序必须围绕特定的库(这可能或可能不符合项目的需求)构建,或者必须为高级操作建立第二个数据库连接(这将是不高效的,并且有些混乱,因为涉及到两个不同的 API)。NADA 通过在支持的所有类型的现有数据库连接对象之上操作,提供了一个干净、轻量级的解决方案。
NADA 的模块化和可扩展设计使其容易添加对其他 DBMS 和数据库抽象层的支持。文件 src/Database/AbstractDatabase.php 和 src/Link/AbstractLink.php 包含了相应的说明。
许可证
NADA 在修订版 BSD 许可证下发布。您可以在同一目录下的 LICENSE 文件中找到完整的许可证。
安装
NADA 可以通过 composer 安装。只需将其添加到项目的 composer.json 文件中
composer require hschletz/nada
用法
PDO 示例
$link = new \PDO($dsn, $user, $password);
$database = \Nada\Factory::getDatabase($link);
getDatabase() 方法检测传入的连接对象所使用的抽象层类型以及它连接的 DBMS 类型。然后设置并返回一个适当的 Nada\Database\AbstractDatabase 子类对象,这是所有后续操作的主要接口。
或者,您可以实例化和调用工厂
$pdo = new \PDO($dsn, $user, $password);
$factory = new \Nada\Factory();
$database = $factory($pdo);
这在您想将工厂作为另一个类的依赖项注入时很有用
class MyClass
{
public funcion __construct(\Nada\Factory $factory, \PDO $pdo)
{
$database = $factory($pdo);
...
}
}
不会启动额外的数据库连接 - 应用程序需要像往常一样连接到数据库。NADA 可以安全地重用任何连接。除非明确请求,否则不会更改连接对象。
可用的类
数据库、表和列由抽象类的 DBMS 特定子类表示
- Nada\Database\AbstractDatabase
- Nada\Table\AbstractTable
- Nada\Column\AbstractColumn
这些子类可能包含在基类中不可用的额外方法。检索这些对象的方法始终返回正确子类的对象。
索引由 Nada\Index 表示,它没有子类,因为它没有 DBMS 特定的功能。
一个额外的基类 Nada\Link\AbstractLink 提供了数据库连接的统一接口。它的子类是围绕传递给工厂方法的数据库连接对象进行包装。这个接口非常有限,并不打算由应用程序使用。它被NADA内部用于所有数据库调用。除非您正在为NADA本身开发,否则请忘记这个类。
错误处理
NADA在发生错误时抛出异常。如果数据库调用失败且连接对象设置为在错误时抛出异常,则会抛出原生异常。否则,NADA会检测到错误并抛出它自己的异常。
注意事项
SQLite不支持直接修改和删除列以及主键。相反,NADA的方法会重新创建具有修改后结构的表。数据以及主键会被保留,但其他属性(约束等)则不会。这适用于同一表的所有列。
当使用laminas-db时,事务检测仅对PDO驱动程序实现。