korim / csv-entities
一个PDO映射库,简化了一对多关系的获取和处理
1.0.2
2024-06-07 00:57 UTC
Requires
- php: ^8.1
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.8
- phpunit/phpunit: ^9.6.19
This package is auto-updated.
Last update: 2024-09-07 01:55:48 UTC
README
使用Koriym.CsvEntities在PDO中有效地管理一对多关系。这个库通过将结果转换成易于管理的PHP实体,简化了获取相关表的过程。对于主实体有多个相关子实体的情况,它简化了数据处理并降低了代码的复杂性。
PDO - 一起获取一个到多个相关表
如以下所示,在PDO中使用Todo创建具有多个Memo的一对多实体列表。
示例
SELECT todo.id AS id, todo.title AS title, memo.id AS memo_id, memo.body AS memo_body FROM todo LEFT OUTER JOIN memo ON memo.todo_id = todo.id GROUP BY todo.id;
Memo类
final class Memo { public string $id, public string $title }
Todo类
final class Todo { public string $id, public string $title, /** @var array<Memo> */ public array $memos, }
用法
按照如下方式更改上面的SQL和实体类。
SELECT todo.id AS id, todo.title AS title, GROUP_CONCAT(memo.id), GROUP_CONCAT(memo.body) FROM todo LEFT OUTER JOIN memo ON memo.todo_id = todo.id GROUP BY todo.id;
final class Memo { public function __construct( public string $id, public string $title ){} }
final class Todo { /** @var array<Memo> */ public array $memos; public function __construct( public string $id, public string $title, string|null $memoIds, string|null $memoBodies ){ $this->memos = (new CsvEntities())(Memo::class, $memoIds, $memoBodies); } }
在query()
SQL之后,如下使用fetchAll
。
$todoList = $pdo->fetchAll(PDO::FETCH_FUNC, static function (...$args) { return new Todo(...$args); });
我们得到了原本预期的Todo[]
数组。
final class Todo { public string $id, public string $title, /** @var array<Memo> */ public array $memos, }
可以指定分隔符。
$this->memos = (new CsvEntities())->get("\t", Memo::class, $memoIds, $memoBodies); // tab separator
为GROUP_CONCAT设置最大连接值
使用GROUP_CONCAT
连接列的最大值必须更改ini文件或查询中的group_concat_max_len
(默认值是1024)。
SET SESSION group_concat_max_len = 200000;
安装
composer require koriym/csv-entities