PHP 8.1+ 数据映射器和表网关
v0.4.2
2023-12-25 10:22 UTC
Requires
- php: ^8.1
- ext-pdo: *
- compositephp/entity: ^v0.1.11
- doctrine/dbal: ^3.5
- psr/simple-cache: 1 - 3
Requires (Dev)
- kodus/file-cache: ^2.0
- phpstan/phpstan: ^1.9
- phpunit/php-code-coverage: ^10.1
- phpunit/phpunit: ^10.1
This package is auto-updated.
Last update: 2024-09-13 14:08:11 UTC
README
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 扩展
安装
- 通过 composer 安装包
$ composer require compositephp/db
- 配置
Composite\DB\ConnectionManager
(示例) - (可选) 配置 symfony/console 命令以使用自动类生成器 (示例)
- (可选) 安装并配置任何 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 维护。