baethon / laravel-criteria
最小化查询条件模式接口
1.1.0
2023-01-31 18:00 UTC
Requires
- php: >=8.1
Requires (Dev)
- illuminate/database: ^9.49
- laravel/pint: ^1.4
- phpunit/phpunit: ^9.5
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)。请参阅许可证文件以获取更多信息。