PHP 8.1+ 数据映射器和表网关

v0.4.2 2023-12-25 10:22 UTC

README

Latest Stable Version Build Status Codecov

Composite DB 是一个轻量级且快速的 PHP 数据映射器和表网关,它允许您使用 PHP 8.1+ 类语法以面向对象风格表示 SQL 表架构。

它还提供了开箱即用的 CRUD、查询构建器和自动缓存,因此您可以在几分钟内开始使用 PHP 代码与数据库交互!

概述

功能

  • 轻量级 - 更简单的实体架构,无需获取器和设置器,您不需要为每个列定义属性,只需使用原生 PHP 类语法即可。
  • 速度 - 在纯 SQL 查询模式下比其他方式快 1.5 倍,在自动缓存模式下速度快得多(见 基准测试)。
  • 易于缓存 - 提供开箱即用的 CRUD 操作缓存,并且通常处理缓存的 "selects" 更加容易。
  • 严格类型 - Composite DB 强制您更严格地使用类型,并使您的 IDE 愉快。
  • 实体化 - 您可以将实体序列化为纯数组或 JSON,并重新反序列化它们。
  • 灵活性 - 提供更多自由来扩展存储库,例如,构建分片表更容易。
  • 代码生成 - 您可以从 SQL 表生成实体和存储库类。
  • 责任分离 - 每个实体都有自己的存储库类,并且它是查询表的唯一入口点。

它还具有许多流行的功能,例如

  • 查询构建器 - 使用构造函数构建查询,基于 doctrine/dbal
  • 迁移 - 同步您的 PHP 实体与数据库表

要求

  • PHP 8.1+
  • 具有所需数据库驱动程序的 PDO 扩展

安装

  1. 通过 composer 安装包
    $ composer require compositephp/db
  2. 配置 Composite\DB\ConnectionManager (示例)
  3. (可选) 配置 symfony/console 命令以使用自动类生成器 (示例)
  4. (可选) 安装并配置任何 PSR-16 (simple cache) 包以使用自动缓存

快速示例

假设您有一个简单的表 Users

create table Users
(
    `id`         int auto_increment,
    `email`      varchar(255)                                         not null,
    `name`       varchar(255)               default NULL              null,
    `is_test`    tinyint(1)                 default 0                 not null,
    `languages`  json                       default '[]'              not null,
    `status`     enum ("ACTIVE", "BLOCKED") default "ACTIVE"          null,
    `created_at` TIMESTAMP                  default CURRENT_TIMESTAMP not null,
    constraint Users_pk primary key (id)
);

首先,您需要执行命令以生成 PHP 实体

$ php console.php composite-db:generate-entity dbName Users 'App\User'

将自动生成新实体类 User 和枚举 Status

#[Table(db: 'dbName', name: 'Users')]
class User extends AbstractEntity
{
    #[PrimaryKey(autoIncrement: true)]
    public readonly int $id;

    public function __construct(
        public string $email,
        public ?string $name = null,
        public bool $is_test = false,
        public array $languages = [],
        public Status $status = Status::ACTIVE,
        public readonly \DateTimeImmutable $created_at = new \DateTimeImmutable(),
    ) {}
}
enum Status
{
    case ACTIVE;
    case BLOCKED;
}

第二步,为您的实体生成一个表类(存储库)

$ php console.php composite-db:generate-table 'App\User' 'App\UsersTable'

到此为止,现在您已经有了 SQL 表的 CRUD 和简单选择

$table = new UsersTable();

//Create
$user = new User(
    email: 'user@example.com',
    name: 'John',
    languages: ['en', 'fr'],
);
$table->save($user);

//Read
$user = $table->findByPk(123);

//Update
$user->status = Status::BLOCKED;
$table->save($user);

//Delete
$table->delete($user);

//Other selects out of the box
$table->findAll();
$table->countAll();

您可以在 这里 找到完整的示例,您可以复制并直接运行。

您还可以将用户实体序列化为数组或 JSON

var_export($user->toArray());

//will output
array (
  'id' => 123,
  'email' => 'user@example.com',
  'name' => 'John',
  'is_test' => false,
  'languages' => '["en","fr"]',
  'status' => 'BLOCKED',
  'created_at' => '2022-01-01 11:22:33.000000',
)

或将实体从数组反序列化(实体化)

$user = User::fromArray([
  'id' => 123,
  'email' => 'user@example.com',
  'name' => 'John',
  'is_test' => false,
  'languages' => '["en","fr"]',
  'status' => 'BLOCKED',
  'created_at' => '2022-01-01 11:22:33.000000',
]);

到此为止,无需特殊的获取器或设置器,无需 "行为" 或额外代码,智能实体会自动处理所有内容。有关实体和受支持的自动转换类型,您可以在这里找到更多信息 here

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 LICENSE。由 Composite PHP 维护。