stwarog/uow-fuel

Fuel PHP ORM 的工作单元功能。

2.0.0 2022-01-27 21:50 UTC

This package is auto-updated.

Last update: 2024-09-28 03:50:19 UTC


README

Packagist PHP Version Support GitHub tag (latest by date)

前言

此包是 Fuel PHP 框架中 UOW 核心库 的扩展。目前它支持 ORM 模型(包含关系)。

零配置安装

composer require stwarog/uow-fuel

只需找到一个初始化此包的地方(将其包装到单例中或使用依赖注入容器),然后调用

FuelEntityManager::forge($db, $config = []);

DB 必须是此类的实例的引用(在 Fuel 中全局可用)。UOW 核心库 将使用现有(并已配置)的对象来根据解析的准则构建查询。

查看 配置指南 以更改包的默认行为。

问题 & 目标

Fuel 的 ORM 使用方便。我们可以使用 OOP 语法来处理关系、批量更新等。假设我们有一个具有许多 LinesTodo 模型,让我们比较以下测试的结果

Fuel 的方式
DB::start_transation();
try {
    $todo = Model_Todo::query()->related('lines')->where('id', 1)->get_one();
    $todo->status = 2;
    
    foreach ($todo->lines as $line) {
        $rand = rand(0, 5);
        $line->content = 'changed' . $rand;
    }
    
    $todo->save();
} catch (Exception $e) {
    DB::rollback_transation();
    throw $e;
}
DB::commit_transation();

但问题是 Fuel 会生成例如(写入部分)

# transaction start

UPDATE `todo_table` SET `status` = 2 WHERE `id` = 1;
UPDATE `lines_table` SET `content` = changed1 WHERE `id` = 1;
UPDATE `lines_table` SET `content` = changed2 WHERE `id` = 2;
UPDATE `lines_table` SET `content` = changed1 WHERE `id` = 3;
UPDATE `lines_table` SET `content` = changed4 WHERE `id` = 4;
...
UPDATE `lines_table` SET `content` = changed1 WHERE `id` = 150;

# transaction commit

如果我们有更多的相关行,可能会对性能造成巨大的影响。

"工作单元" 方法

让我们将上面的代码重构为此插件语法

$entityManager = FuelEntityManager::forge($db, $config = []);

$todo = Model_Todo::query()->related('lines')->where('id', 1)->get_one();
$todo->status = 2;

foreach ($todo->lines as $line) {
    $rand = rand(0, 5);
    $line->content = 'changed' . $rand;
}

$entityManager->save($todo);
$entityManager->flush();

# or inline $entityManager->save($todo, $flush = true)

脚本将分组更改的表列和字段,并以更优雅的方式构建查询!所有这些都将自动包裹在事务中。

# transaction start

UPDATE `todo_table` SET `status` = 2 WHERE `id` IN (1);
UPDATE `lines_table` SET `content` = changed1 WHERE `id` IN (1,2,3,4,5,6,7,8,9...10);
UPDATE `lines_table` SET `content` = changed2 WHERE `id` IN (11,12,13,14,15,16,17,18,19...100);

# transaction commit

当然,这些例子很简答。在现实生活中,每个模型可能有很多嵌套关系。实体管理器将负责如何构建最终的查询。

贡献

请查看核心 贡献指南

许可

MIT

变更日志

1.4.0 (2021-07-21)
  • 升级核心包到 1.4.0
  • 实现了在 FuelModelAdapter.php 中不再使用的新功能
  • 单元测试配置 + Fuel ORM 的伪模拟
1.3.1 (2021-07-10)
  • 升级核心包到 1.3.1
1.3.0 (2021-06-23)
  • 升级核心包到 1.3.0
  • 将 phpstan 错误减少到 2
1.2.0 (2021-06-21)
  • 升级核心包到 1.2.0
  • 添加 ./tests 到 .gitignore
  • 安装并配置 PHPCS、PHPSTAN
1.1.3 (2021-01-04)
  • 398d1247 使用了 uow 核心库的最新版本
1.1.2 (2021-01-03)
  • a0bf93b7 使用了 array_diff_assoc 而不是 array_diff,因为没有检查列