tflori/orm

轻量级对象关系映射器


README

.github/workflows/push.yml Test Coverage Maintainability Latest Stable Version Total Downloads License

Logo

TL;DR 别的都不好,我们能做得更好。

为什么还要创建另一个ORM?PHP中已经没有足够的ORM实现了吗?

是的,实现有很多

  • doctrine/orm
    • 重量级:包含你不需要的所有内容的8.8MB,6个直接依赖及其自己的依赖
    • 注释使它难以阅读
    • 在多表连接时,查询量很大或查询速度非常慢
  • propel/propel
    • 仍然不稳定,2.0-dev
    • 甚至比doctrine更重
    • 需要大量配置
  • j4mie/idiorim 和 j4mie/paris
    • 使用了很多静态方法,难以测试
    • 与现有的依赖注入模型不兼容
    • 最后更新2年前
    • 所有内容都在一个文件中
    • ...

此实现将具有以下功能

  • 无需配置
    • 当然,有一些配置是必要的(例如,如何连接到您的数据库?)
    • 当然,这只有在您按照我们的想法设置数据库时才可行。如果不是这样,您只需设置系统的规则和命名约定。
  • 易于使用
  • 轻量级源代码
  • 快速

如何实现这些功能?Doctrine的主要目标似乎是抽象化一切 - 最终您应该能够替换您应用背后的整个DBMS,并从postgresql切换到sqlite。这需要大量的源代码。这也需要一些额外的周期来使这些抽象化工作。

此库将仅生成任何SQL数据库都应该理解的ANSI-SQL。其他查询需要手动编写。这有两个原因

  1. 您可以编写更快、更高效的查询
  2. 我们不需要编写大量的抽象(更多代码;更多错误)

此库不会捕获开发者可能犯的任何错误。它的目标是成为存储数据的助手,而不是替换您的数据库以及您如何使用此数据库的知识。您可能会犯很多错误 - 比没有此库时少,但仍然很多。当您犯了一个没有被捕获的错误(通常我们只会捕获会导致致命错误的错误)时,您将得到一个PDOException

设置

通过composer安装,配置它,然后使用它。

composer require tflori/orm
<?php

$entityManager = new ORM\EntityManager([
      ORM\EntityManager::OPT_CONNECTION => ['pgsql', 'mydb', 'postgres']
]);

$user = $entityManager->fetch(User::class, 1);

echo $user->username;

阅读文档以获取更多信息。

已知问题

复合主键

#52 复合主键需要SQLite >= 3.15(或另一个数据库)才能在插入后同步工作。所使用的语法在SQLite 3.15中添加。

贡献

请遵循PSR-2风格指南,并使用此命令更新API参考文档

$ docker run --rm --user $(id -u) -v $(pwd):/data -v $(pwd)/docs/_reference:/opt/phpdoc/data/templates/_reference iras/phpdoc2:2 phpdoc -c phpdoc.xml

在创建拉取请求之前,请确保单元测试是绿色的,并且覆盖率保持不变

$ docker run --rm --user $(id -u) -v $(pwd):/app -w /app iras/php7 vendor/bin/phpunit
### with coverage:
$ docker run --rm --user $(id -u) -v $(pwd):/app -w /app iras/php7 php -dzend_extension=xdebug.so vendor/bin/phpunit --coverage-text