colybri/criteria

实现过滤/标准模式的辅助类

v1.0.2 2022-04-15 20:06 UTC

This package is auto-updated.

Last update: 2024-09-16 02:12:11 UTC


README

此包允许构建自定义的标准和任何类型的过滤器,还包括一个用于与 Doctrine 数据库抽象层一起使用的适配器。

领域驱动设计系列

此包是构建应用程序领域驱动设计方法的一系列高级构建块中的第一个。

目录

安装

通过Composer

$ composer require colybri/criteria

使用方法

创建标准

new Criteria(
    Filters::from([
        Filter::from(
            FilterField::from(CountryName::class),
            FilterOperator::Contains,
            FilterValue::from('Samoa')
         ),
        Filter::from(
            FilterField::from(CountryAlpha2Code::class),
            FilterOperator::Contains,
            FilterValue::from('WS')
        )
        ...
    ]),
    Order::from(OrderBy::from(CountryName::class), OrderType::Desc),
    0,
    100
);   

一个过滤器由三个对象组成。第一个是与你的数据库列名称的键/值映射匹配的字段键。第二个参数是你想用于条件的运算符。最后一个是你想要匹配的值。

指定排序

第一个参数是用于排序结果的字段的键。其次,排序类型。

Order::from(OrderBy::from(CountryName::class), OrderType::Desc),

限制结果

如果你不想限制你的结果,只需将 null 设置为 Criteria 的最后两个参数。否则设置偏移量和限制。

嵌套过滤器

为了使用逻辑运算符 OR 或嵌套条件。

new Criteria(
    Filters::from(
        Conjunction::fromfilters(   
            Disjunction::fromfilters(
                Filter::from(
                    FilterField::from(CountryAlpha2Code::class),
                    FilterOperator::Equal,
                    FilterValue::from('SW')
                 ),
                Filter::from(
                    FilterField::from(CountryAlpha2Code::class),
                    FilterOperator::Equal,
                    FilterValue::from('WS')
                )
                ...
            ),
            Filter::from(
                 FilterField::from(CountryName::class),
                 FilterOperator::Contains,
                 FilterValue::from('Samoa')
            ),
            ...
        )
    ),
    Order::none(),
    null,
    null
);

适配器

Dbal适配器

在你的仓库中

        $query = $this->dbalConnection->createQueryBuilder()
            ->select('*')->from('countries');

        (new CriteriaDbalAdapter($query, new CountryMap()))->build($criteria);

        $countries = $query->executeQuery()->fetchAllAssociative();

映射数据库字段

在上面的例子中,CountryMap 是一个必须实现 EntityMap 接口的基础类。如下所示。属性 FIELDS 是一个键/值数组,其中键是你用于领域的语义名称,值是数据库中匹配的列名称。

final class CountryMap implements EntityMap
{
    private const FIELDS = [
        CountryName::class => 'en_short_name',
        CountryAlpha2Code::class => 'alpha_2_code'
    ];

    private const TABLE = 'countries';

    public function map(string $attribute): string
    {
        return self::FIELDS[$attribute];
    }

    public static function table(): string
    {
        return self::TABLE;
    }
}

鸣谢

许可证

MIT