star/规格

规格系统,允许将规格应用于数据源。

0.2.0 2024-01-11 19:01 UTC

This package is auto-updated.

Last update: 2024-09-11 20:22:55 UTC


README

Build Status

php的规格系统。提供了一些库的适配器。

安装

使用Composer: composer require star/php-specification

使用方法

使用基本的php数组

fetchAll()

获取所有匹配规格的项目

$data = [
    [
        'id' => 1,
        'name' => 'Joe',
        'active' => false,
    ],
    [
        'id' => 2,
        'name' => 'Jane',
        'active' => true,
    ],
    [
        'id' => 3,
        'name' => 'Jack',
        'active' => true,
    ],
];
$result = ArrayResult::fromRowsOfMixed(...$data);
$items = $result->fetchAll(EqualsTo::fromBoolean('alias', 'active', true));
echo $items->count(); // 2
echo $items->getValue(0, 'name')->toInteger(); // Jane
echo $items->getValue(1, 'name')->toInteger(); // Jack

fetchOne()

获取单个匹配规格的项目

注意:如果规格结果超过一行,将抛出NotUniqueResult异常

$data = [
    [
        'id' => 1,
        'name' => 'Joe',
        'active' => false,
    ],
    [
        'id' => 2,
        'name' => 'Jane',
        'active' => true,
    ],
    [
        'id' => 3,
        'name' => 'Jack',
        'active' => true,
    ],
];
$result = ArrayResult::fromRowsOfMixed(...$data);
$row = $result->fetchOne(EqualsTo::booleanValue('alias', 'active', false));
echo $row->count(); // 1
echo $row->getValue('name')->toInteger(); // Joe

exists()

获取是否有一个项目匹配规格

$data = [
    [
        'id' => 1,
        'name' => 'Joe',
        'active' => false,
    ],
    [
        'id' => 2,
        'name' => 'Jane',
        'active' => true,
    ],
    [
        'id' => 3,
        'name' => 'Jack',
        'active' => true,
    ],
];
$result = ArrayResult::fromRowsOfMixed(...$data);
echo $result->exists(EqualsTo::stringValue('alias', 'name', 'Joe')); // true
echo $result->exists(EqualsTo::stringValue('alias', 'name', 'Not found')); // false

支持的规格

EqualsTo

属性的值是否与提供的值完全匹配(===)。

示例

EqualsTo::stringValue('alias', 'name', 'Joe');

注意:两个值都将转换为字符串以断言相等。

Between

属性的数值或日期值是否在左右值之间。

示例

Between::integers('alias', 'age', 18, 40);
Between::dates('alias', 'published_at', new \DateTime('1900-01-01'), new \DateTime('2000-01-01 12:34:56'));

注意:格式Y-m-d H:i:s是唯一支持的用于比较的格式。

Contains

提供的值是否在项目的属性(开始、结束、中间)的任何位置找到。

示例

Contains::string('alias', 'name', 'Joe');

EndsWith

提供的值是否在项目的属性的末尾找到。

示例

EndsWith::string('alias', 'name', 'Joe');

Greater

属性的数值或日期值是否大于提供的值。

示例

Greater::thanInteger('alias', 'age', 18);
Greater::thanDate('alias', 'born_at', new \DateTime('2000-01-01'));

GreaterEquals

属性的数值或日期值是否大于或等于提供的值。

示例

GreaterEquals::thanInteger('alias', 'age', 18);
GreaterEquals::thanDate('alias', 'born_at', new \DateTime('2000-01-01'));

InArray

属性的值是否包含在提供的值范围内。

示例

InArray::ofIntegers('alias', 'age', 18, 20, 34); // would return items with age 18, 20 or 34.

IsEmpty

属性的值是否为空值。

示例

new IsEmpty('alias', 'name');

注意:零、布尔false被视为空。

IsNot

反转提供的规格。

示例

new IsNot(Lower::thanInteger('alias', 'age', 18)); // would return items with age >= 19.

IsNull

属性的值是否为null值。

示例

new IsNull('alias', 'age');

注意:零、布尔false和空字符串不被视为null。

Lower

属性的数值或日期值是否小于提供的值。

示例

Lower::thanInteger('alias', 'age', 18);
Lower::thanDate('alias', 'age', new \DateTime('2000-01-01'));

LowerEquals

属性的数值或日期值是否小于或等于提供的值。

示例

LowerEquals::thanInteger('alias', 'age', 18);
LowerEquals::thanDate('alias', 'age', new \DateTime('2000-01-01'));

StartsWith

提供的值是否在项目的属性的开始位置找到。

示例

StartsWith::string('alias', 'name', 'Joe');

组合(And / Or)

使用AndXOrX,您可以配置更复杂的规格以满足需求。

示例

// equivalent to "name = 'Joe' AND active = true"
new AndX(
    EqualsTo::stringValue('alias', 'name', 'Joe'),
    EqualsTo::booleanValue('alias', 'active', true),
);

// equivalent to "name = 'Joe' OR active = true"
new OrX(
    EqualsTo::stringValue('alias', 'name', 'Joe'),
    EqualsTo::booleanValue('alias', 'active', true),
);

按属性排序

我们还可以使用1个或多个属性对规格进行排序。

示例

new AndX(
    OrderBy::desc('alias', 'is_active'),
    OrderBy::asc('alias', 'age'),
    OrderBy::desc('alias', 'name'),
);
new OrX(
    OrderBy::desc('alias', 'is_active'),
    OrderBy::asc('alias', 'age'),
    OrderBy::desc('alias', 'name'),
);

支持的框架