quibble / transformer
查询结果(集)转换器
Requires
- php: >=7.3
- monomelodies/reflex: ^0.3
Requires (Dev)
- gentry/gentry: ^0.13.0
- toast/unit: ^1.3
This package is auto-updated.
Last update: 2024-08-29 22:58:15 UTC
README
查询结果(集)转换器
轻松地将单个结果集或数据库查询结果集合转换为其他类型。
安装
$ cd /path/to/your/project
$ composer require quibble/transformer
用法
实例化转换器并调用 collection
或 resource
方法。第一个参数是查询结果,第二个参数是用于确定如何转换结果(集)的可调用函数。
<?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。