artemeon / orm
v0.1.2
2023-10-17 07:40 UTC
Requires
- artemeon/database: ^3.1
- doctrine/collections: ^2.0
- psr/simple-cache: ^3.0
Requires (Dev)
- phpunit/phpunit: ^10.0
- symfony/cache: ^6.0
- vimeo/psalm: ^5.15
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_system
和 agp_contracts_con
,并包含相应的列。
设计
此 ORM 遵循 Data-Mapper 模式,这意味着你的实体是简单的 PHP 类,你只定义属性和 getter/setter,你的实体不包含任何业务逻辑。要操作实体,你需要使用 EntityManager
。
目标
无需根
目前每个实体都必须从 Root
实体扩展,该实体映射到 agp_system
表。这意味着每个实体都在 agp_system
表中有一个条目,因此 agp_system
表变得非常大。使用此 ORM,我们有可能创建一个不扩展 Root
实体的实体,这为我们提供了更多的灵活性,最终也提高了性能。
兼容性
我们尝试将此 ORM 作为当前 ORM 的直接替代品,这样我们就不需要更改每个模型的逻辑。未来我们也可能完全改变 ORM,但这应该是第二步。
改进的列选项
目前我们无法指定列长度,长度已集成在数据类型中。这应该提供一种为列设置自定义长度的方法。