quibble/transformer

查询结果(集)转换器

0.3.2 2020-03-16 09:40 UTC

README

查询结果(集)转换器

轻松地将单个结果集或数据库查询结果集合转换为其他类型。

安装

$ cd /path/to/your/project
$ composer require quibble/transformer

用法

实例化转换器并调用 collectionresource 方法。第一个参数是查询结果,第二个参数是用于确定如何转换结果(集)的可调用函数。

<?php

use Quibble\Transformer\Transformer;

$transformer = new Transformer;

$results = $statement->fetchAll();
$results = $transformer->collection($results, function () {});

$result = $statement->fetch();
$result = $transformer->resource($result, function () {});

内部,collection 只是 array_map(Transformer::resource) 的一个方便的前端。在其他所有方面,它们都按相同的方式工作。因此,本README的其余部分将仅使用 resource

默认行为是从资源中删除所有数字键,就像使用 PDO::FETCH_ASSOC 获取它一样。要覆盖此行为,您可以实例化转换器并使用一个 false 参数。

您只能转换返回为数组的查询结果。假设如果将数据“放入”对象(模型)中,这些对象将执行自己的转换。但是,您将稍后看到如何将数据转换到对象中。

定义转换

指定转换的关键是要对希望转换的命名参数进行 类型提示。默认情况下,PDO 将大多数内容作为字符串返回。我们可以简单地指定一些希望转换的字段

<?php

$result = $transformer->resource($result, function (int $id, bool $active) {});

我们还可以对任何对象进行类型提示。假设此类对象将使用原始值作为其第一个也是唯一参数进行实例化。例如。

<?php

use Carbon\Carbon;

$result = $transformer->resource($result, function (Carbon $datecreated) {});

未特别转换的字段将按原样传递,而转换中提到的但不在结果中出现的字段将被简单地忽略。这种想法是您指定具有 所有 可转换字段的表的转换器,但您的查询不一定执行 "SELECT *"。这样,您可以轻松地重用转换器。

修改返回类型

PHP7+ 允许我们进行返回类型提示。如果转换器这样做,将返回该类型的对象(或者在 collection 的情况下返回它们的数组)。

<?php

$result = $transformer->resource($result, function () : stdClass {});
$result typeof stdClass; // true

指定多个转换器

可以提供多个转换器;只需添加额外的参数。它们按顺序应用,如果有多个指定返回类型,则 仅使用最后一个。这允许您快速指定对某些查询结果的覆盖。如果使用此方法两次转换字段,则首先将其转换回字符串,然后再传递给下一个转换器。如果您希望传递 转换后的 值(因为您的装饰器在其构造函数中使用类型提示)指定一个默认 null 值。

集中您的代码(DRY)

而不是手动传递lambda,更干净的模式是指定您的转换器为 类方法。您可以在模型上或中央 接口 中这样做。记住,我们实际上并没有调用这些方法,我们只是想要检查它们!

<?php

use Carbon\Carbon;

interface MySchema
{
    public function foo(int $id, Carbon $datecreated) : MyAwesomeModel;
    // A return type of array is actually the default.
    public function bar(int $id, bool $valid) : array;
}

$fooResult = $transformer->resource($fooResult, [MySchema::class, 'foo']);
$barResult = $transformer->resource($barResult, [MySchema::class, 'bar']);

常见问题解答

我需要其他Quibble模块才能使用此模块吗?

不需要。只要您处理的是数组,您甚至不需要PDO。