micoli / elql
v0.6.2
2023-07-22 10:00 UTC
Requires
- php: >=8.1
- symfony/expression-language: ^6.0
- symfony/filesystem: ^6.0
- symfony/lock: ^6.0
- symfony/property-access: ^6.0
- symfony/property-info: ^6.0
- symfony/serializer: ^6.0
- symfony/yaml: ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
- php-coveralls/php-coveralls: ^0.1.0
- phpdocumentor/reflection-docblock: ^5.3
- phpunit/phpunit: ^10.0
- ramsey/uuid: ^4.7
- symfony/var-dumper: ^6.0
- vimeo/psalm: ^5.9
README
一个平面数据库管理器。每个模型都通过一个 (YAML
|JSON
) 文件进行读取/持久化。
该库基于 symfony/serializer
和 symfony/expression-language
组件。因此,基本上,可以通过这些组件进行序列化/反序列化的每个模型都可以使用。
在 select
、updat
、delet
记录时,每个约束都表示为 expression-language
字符串。一个 record
对象在约束表达式中可用,代表已评估的记录。
安装
此库可以通过 Composer 安装
composer require micoli/elql
要求
此库需要 PHP 8.0 或更高版本。
项目状态
虽然这个库仍在开发中,但它仍然处于早期开发状态。它遵循 semver 版本标记。
快速入门
创建 Elql 管理器的一个实例
数据库按目录划分。所有模型都保存在单独的文件中。
$database = new Elql( new FilePersister( '/var/lib/database', new MetadataManager(), YamlEncoder::FORMAT, ), );
如果它们尚未加载,则在每次 CRUD 操作之前将持久化的记录加载到内存中。
内存中记录添加
添加一些合适的可序列化模型的记录。
$database->add( new Baz(1, 'a', 'a'), new Baz(2, 'b', 'b'), new Baz(3, 'c', 'c'), new Baz(4, 'd', 'd'), new Foo(1, 'aa', new DateTimeImmutable()), );
基本 CRUD 功能可用
选择
$records = $database->find(Baz::class, 'record.id==3');
更新
使用更新器回调来帮助 case/case 模型更新
$database->update(Baz::class, function (Baz $record) { $record->firstName = $record->firstName . '-updated'; return $record; }, 'record.id==3');
删除
$database->delete(Baz::class, 'record.id in [1,4]');
计数
print $database->count(Baz::class, 'record.id in [1,4]');
您需要将内存中的表刷新到磁盘以持久化它们
$database->persister->flush();
/var/lib/database/Foo.yaml
/var/lib/database/Bar.yaml
属性
表($name)
您可以使用该属性指定一个特定的名称,而不是使用类名作为文件名。
#[Table('b_a_z')] class Baz { public function __construct( public readonly int $id, public string $firstName, public string $lastName, ) { } }
注意。
如果您不想使用该属性,您可以在 MetadataManager
构造函数中指定一些文件名。
$database = new Elql( new FilePersister( '/var/lib/database', new MetadataManager([ Foo::class=>'foo_table' ]), YamlEncoder::FORMAT, ), );
在这种情况下,当 Foo
记录将被持久化时,文件名将是 foo_table.yaml
。
唯一($expression, $indexName)
在将记录添加到模型表之前,将评估唯一约束以确保记录的唯一性。
#[Unique('record.id')] #[Unique('[record.firstName,record.lastName]', 'fullname')] class Baz { public function __construct( public readonly int $id, public string $firstName, public string $lastName, ) { } }
如果约束不被遵守,将触发 Micoli\Elql\Exception\NonUniqueException
。