korim/csv-entities

一个PDO映射库,简化了一对多关系的获取和处理

1.0.2 2024-06-07 00:57 UTC

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