stwarog / uow-fuel
Fuel PHP ORM 的工作单元功能。
2.0.0
2022-01-27 21:50 UTC
Requires
- php: >=8.0.0
- fuel/core: ^1.8 | dev-1.9/develop
- fuel/orm: ^1.8 | dev-1.9/develop
- stwarog/uow: ^2.0.0
Requires (Dev)
- phpstan/phpstan: ^0.12.90
- phpunit/phpunit: 7.1.3
- squizlabs/php_codesniffer: ^3.6
- symfony/var-dumper: ^5.1
This package is auto-updated.
Last update: 2024-09-28 03:50:19 UTC
README
前言
此包是 Fuel PHP 框架中 UOW 核心库 的扩展。目前它支持 ORM 模型(包含关系)。
零配置安装
composer require stwarog/uow-fuel
只需找到一个初始化此包的地方(将其包装到单例中或使用依赖注入容器),然后调用
FuelEntityManager::forge($db, $config = []);
DB 必须是此类的实例的引用(在 Fuel 中全局可用)。UOW 核心库 将使用现有(并已配置)的对象来根据解析的准则构建查询。
查看 配置指南 以更改包的默认行为。
问题 & 目标
Fuel 的 ORM 使用方便。我们可以使用 OOP 语法来处理关系、批量更新等。假设我们有一个具有许多 Lines
的 Todo
模型,让我们比较以下测试的结果
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,因为没有检查列