v0.1.2 2023-10-17 07:40 UTC

This package is auto-updated.

Last update: 2024-09-11 11:59:13 UTC


README

此仓库包含 AGP 平台的 ORM。它从内部 ORM 提取出来,形成一个通用 ORM,也可以用于其他项目。它仍在开发中,但目标是最终替代 AGP 内部 ORM。

想法

ORM 的主要思想非常简单,基本上你可以将 TableColumn 属性附加到你的实体上,ORM 会根据这些属性构建表结构。它具有特殊的继承处理,以便每个父类都有自己的表。然后 ORM 会自动在查询时连接这些表。

#[TableName('agp_contracts_con')]
class TestModel extends TestParent
{
    #[TablePrimary('contract_id')]
    private string $contractId;

    #[TableColumn('servicerid', DataType::STR_TYPE_CHAR20)]
    private $strServicerId;

    #[TableColumn('inhouseservice', DataType::STR_TYPE_INT)]
    private $intInhouseService;

    #[TableColumn('outsourcing_i', DataType::STR_TYPE_CHAR20)]
    private ?string $outsourcingInstitution = null;

    #[TableColumn('purchasing_relevance', DataType::STR_TYPE_INT)]
    private ?int $purchasingRelevance = 0;

    // getter/setter
}

#[TableName('agp_system')]
class TestParent implements EntityInterface
{
    #[TablePrimary('system_id')]
    private string $systemId;

    #[TableColumn('owner', DataType::STR_TYPE_CHAR20)]
    private ?string $owner = null;

    // getter/setter
}

这些实体类将生成两个表 agp_systemagp_contracts_con,并包含相应的列。

设计

此 ORM 遵循 Data-Mapper 模式,这意味着你的实体是简单的 PHP 类,你只定义属性和 getter/setter,你的实体不包含任何业务逻辑。要操作实体,你需要使用 EntityManager

目标

无需根

目前每个实体都必须从 Root 实体扩展,该实体映射到 agp_system 表。这意味着每个实体都在 agp_system 表中有一个条目,因此 agp_system 表变得非常大。使用此 ORM,我们有可能创建一个不扩展 Root 实体的实体,这为我们提供了更多的灵活性,最终也提高了性能。

兼容性

我们尝试将此 ORM 作为当前 ORM 的直接替代品,这样我们就不需要更改每个模型的逻辑。未来我们也可能完全改变 ORM,但这应该是第二步。

改进的列选项

目前我们无法指定列长度,长度已集成在数据类型中。这应该提供一种为列设置自定义长度的方法。