baethon/laravel-criteria

最小化查询条件模式接口

1.1.0 2023-01-31 18:00 UTC

This package is auto-updated.

Last update: 2024-08-29 04:37:20 UTC


README

Laravel的查询条件模式的最小化实现。

什么是查询条件?

查询条件是 \Baethon\LaravelCriteria\CriteriaInterface 的一个实现,它只负责一件事——以指定方式修改Laravel的查询。

这允许解耦和重用查询修饰符。

查询条件与 Eloquent作用域 非常相似。主要区别是它们可以应用于应用程序中的不同模型。

安装

composer require baethon/laravel-criteria

要求

  • PHP >= 7.1

Laravel 兼容性

这个库对Laravel本身没有依赖。它应该与Laravel的所有版本兼容。

用法

首先,您需要创建 CriteriaInterface 的一个实现

<?php

use Baethon\LaravelCriteria\CriteriaInterface;

class CompareCriteria implements CriteriaInterface
{
    private $field;

    private $value;

    public function __construct(string $field, string $value)
    {
        $this->field = $field;
        $this->value = $value;
    }

    public function apply($query)
    {
        $query->where($this->field, $this->value);
    }
}

现在,您可以将它 应用到查询中

$query = User::query();

(new CompareCriteria('name', 'Jon'))->apply($query);

$jon = $query->first();

应用Criteria特质

为了简化问题,可以在模型中使用 AppliesCriteria 特质。

use Baethon\LaravelCriteria\Traits\AppliesCriteria;

class User extends Model
{
    // model body stripped for better readability

    use AppliesCriteria;
}

$jon = User::query()
    ->apply(new CompareCriteria('name', 'Jon'))
    ->first();

集合

该包提供集合,允许一次性应用多个查询条件。

要应用一组查询条件,请使用 \Baethon\LaravelCriteria\Collections\CriteriaCollection

$jonSnow = User::query()
    ->apply(CriteriaCollection::create([
        new CompareCriteria('name', 'Jon'),
        new CompareCriteria('lastname', 'Snow'),
    ]))
    ->first();

// same result, without CriteriaCollection
$jonSnow = User::query()
    ->apply(new CompareCriteria('name', 'Jon'))
    ->apply(new CompareCriteria('lastname', 'Snow'))
    ->first();

如果您需要确保所有查询条件都将得到满足,可以使用 CriteriaCollection::allOf()

User::query()
    ->apply(CriteriaCollection::allOf([
        new CompareCriteria('name', 'Jon'),
        new CompareCriteria('lastname', 'Snow'),
    ]));

// same as
User::query()
    ->where(function ($query) {
        $query->apply(new CompareCriteria('name', 'Jon'))
            ->apply(new CompareCriteria('lastname', 'Snow'));
    });

此外,您还可以使用逻辑 OR 连接来分组查询条件

User::query()
    ->apply(CriteriaCollection::oneOf([
        new CompareCriteria('name', 'Jon'),
        new CompareCriteria('lastname', 'Snow'),
    ]));

// same as
User::query()
    ->where(function ($query) {
        $query->where('name', 'Jon')
            ->orWhere('lastname', 'Snow');
    });

测试

使用以下命令运行测试

./vendor/bin/phpunit

更新日志

请参阅 更新日志 了解最近更改的更多信息。

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。