xepozz/remap

此包的最新版本(1.0)没有提供许可证信息。

1.0 2024-03-16 20:38 UTC

This package is auto-updated.

Last update: 2024-09-17 13:47:35 UTC


README

该库允许您将数据库中的数据映射到对象中。

Latest Stable Version Total Downloads phpunit codecov type-coverage

描述

主要目标是简化查询长SQL查询并将结果映射到对象的过程。

该映射器设计用于同时查询多个对象。它使用 \Generator 从数据库中获取数据并将其逐个映射到对象,因此它内存效率高。

底层使用

安装

composer req xepozz/remap

用法

将类名和查询传递给 Remap

final class Todo
{
    public int $id;
    public string $title;
    public int $status;
    public int $created_at;
}
$sql = 'SELECT id, title, status, created_at FROM todo WHERE id = :id LIMIT 1';
$params = ['id' => 1];

$remap->map(Todo::class, $sql, $params); // returns \Generator of Todo objects

湿化

使用 yiisoft/hydrator 带来了 Hydrator 库的好处: 属性 修改湿化过程的行为。

use Yiisoft\Hydrator\Attribute\Parameter\Data;
use Yiisoft\Hydrator\Attribute\SkipHydration;

final class TodoModelHydrator
{
    #[Data('id')]
    public string $identifier;
    #[Data('title')]
    public string $text;
    public string $status;
    #[Data('created_at')]
    public string $date_created;
}

或任何与 Hydrator 库兼容的其他属性。

提示

在类中定义与查询相关的方法

final class Todo
{
    public int $id;
    public string $title;
    public int $status;
    public int $created_at;

    public static function selectOne(int $id): array
    {
        return [
            'SELECT id, title, status, created_at FROM todo WHERE id = :id LIMIT 1',
            ['id' => $id],
        ];
    }

    public static function selectAll(): string
    {
        return 'SELECT id, title, status, created_at FROM todo';
    }
}

现在使用很简单

$remap->map(Todo::class, ...Todo::selectOne(1)); // selectOne may return ['SELECT ...', ['id' => 1]]
$remap->map(Todo::class, Todo::selectOne(1)); // or shorter, without unpacking
$remap->map(Todo::class, Todo::selectAll());
$remap->map(...Todo::selectAll()); // selectAll may return [Todo::class, "SELECT ..."]

解包并存储结果

$remap->map(...)

始终返回一个生成器。如果您想获取对象数组,请使用 iterator_to_array

$result = iterator_to_array(
    $remap->map(Todo::class, Todo::selectOne(1))
);

或者更短

$result = [...$remap->map(Todo::class, Todo::selectOne(1))];