hschletz/nada

NADA 是一个针对 PHP 的高层次 SQL 抽象库,它补充并作用于传统的数据库抽象层之上

v1.2.4 2024-06-02 15:05 UTC

This package is auto-updated.

Last update: 2024-09-02 15:41:54 UTC


README

关于 NADA

NADA 是一个针对 PHP 的高层次 SQL 抽象库。它补充并作用于传统的数据库抽象层之上(目前支持:PDOlaminas-db),使得它能够轻松集成到现有应用程序中。

NADA 为不同的数据库后端提供了 SQL 抽象方法(目前支持:PostgreSQLMySQL/MariaDBSQLite),这些方法在典型的数据库抽象层中是不可用的,这些抽象层通常只提供一个统一的数据库连接接口。相比之下,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驱动程序实现。