micoli/elql

v0.6.2 2023-07-22 10:00 UTC

This package is auto-updated.

Last update: 2024-09-22 12:20:00 UTC


README

一个平面数据库管理器。每个模型都通过一个 (YAML|JSON) 文件进行读取/持久化。

该库基于 symfony/serializersymfony/expression-language 组件。因此,基本上,可以通过这些组件进行序列化/反序列化的每个模型都可以使用。

selectupdatdelet 记录时,每个约束都表示为 expression-language 字符串。一个 record 对象在约束表达式中可用,代表已评估的记录。

Build Status Coverage Status Latest Stable Version Total Downloads Latest Unstable Version License PHP Version Require

安装

此库可以通过 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