查询构造器
简介
查询构造器(Query Builder)允许你自定义一套复杂的条件,在表格中过滤数据。它能够处理无限嵌套条件,这就允许你使用 "and" 和 "or" 操作符进行分组。
要使用它,你需要定义一套用于过滤数据的"约束条件(constraints)"。Filament 包含了一些遵循通用数据类型的内置约束,不过你也可以自定义约束。
使用 QueryBuilder 过滤器,你可以将查询构造器添加到任何表格中:
use Filament\Tables\Filters\QueryBuilder;
use Filament\Tables\Filters\QueryBuilder\Constraints\BooleanConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\DateConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\NumberConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\RelationshipConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\RelationshipConstraint\Operators\IsRelatedToOperator;
use Filament\Tables\Filters\QueryBuilder\Constraints\SelectConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\TextConstraint;
QueryBuilder::make()
->constraints([
TextConstraint::make('name'),
BooleanConstraint::make('is_visible'),
NumberConstraint::make('stock'),
SelectConstraint::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->multiple(),
DateConstraint::make('created_at'),
RelationshipConstraint::make('categories')
->multiple()
->selectable(
IsRelatedToOperator::make()
->titleAttribute('name')
->searchable()
->multiple(),
),
NumberConstraint::make('reviewsRating')
->relationship('reviews', 'rating')
->integer(),
])
当深度嵌套查询构造器时,你可能需要增加过滤器占用的空间数量。其中一个方式是,将过滤器放在表格内容之上:
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\QueryBuilder;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->filters([
QueryBuilder::make()
->constraints([
// ...
]),
], layout: FiltersLayout::AboveContent);
}
可用约束
Filament 随附了许多开箱即用的约束。你也可以创建自定义约束:
文本约束
文本约束(Text constraints)允许你过滤文本字段。可用于过滤任何文本字段,包括通过关联来的文本。
use Filament\Tables\Filters\QueryBuilder\Constraints\TextConstraint;
TextConstraint::make('name') // Filter the `name` column
TextConstraint::make('creatorName')
->relationship(name: 'creator', titleAttribute: 'name') // Filter the `name` column on the `creator` relationship
默认情况下,有如下一些可用操作符:
- Contains - 筛选包含搜索条件的字段
- Does not contain - 筛选不包含搜索条件的字段
- Starts with - 筛选以搜索条件为开头的列字段
- Does not start with - 筛选不以搜索条件为开头的列字段
- Ends with - 筛选以搜索条件为结尾的列字段
- Does not end with - 筛选不以搜索条件为结尾的列字段
- Equals - 筛选等于搜索词的列字段
- Does not equal - 筛选不等于搜索词的列字段
- Is filled - 筛选包含不为空的字段
- Is blank - 筛选包含值为空的字段
布尔值约束
布尔值约束(Boolean constraint)允许你过滤布尔值字段。可用于过滤任何布尔值字段,包括关联中的布尔值字段。
use Filament\Tables\Filters\QueryBuilder\Constraints\BooleanConstraint;
BooleanConstraint::make('is_visible') // Filter the `is_visible` column
BooleanConstraint::make('creatorIsAdmin')
->relationship(name: 'creator', titleAttribute: 'is_admin') // Filter the `is_admin` column on the `creator` relationship
默认情况下,以下操作符可用:
- Is true - 筛选值为
true的字段 - Is false - 筛选值为
false的字段
数值约束
数值约束(Number constraint)允许你过滤数值型字段。可用于过滤任何数值型字段,包括关联中的字段。
use Filament\Tables\Filters\QueryBuilder\Constraints\NumberConstraint;
NumberConstraint::make('stock') // Filter the `stock` column
NumberConstraint::make('ordersItemCount')
->relationship(name: 'orders', titleAttribute: 'item_count') // Filter the `item_count` column on the `orders` relationship
默认情况下,可以使用如下操作符:
- Is minimum - 筛选大于或等于所搜索数字的字段
- Is less than - 筛选小于所搜索数字的字段
- Is maximum - 筛选小于或等于所搜索数字的字段
- Is greater than - 筛选大于所搜索数字的字段
- Equals - 筛选等于所搜索数字的字段
- Does not equal - 筛选不等于所搜索数字的字段
- Is filled - 筛选不为空的字段
- Is blank - 筛选空值字段
当数值约束中使用 relationship() 时,用户也可以"聚合"关联记录。也就是说,可以过滤列字段使之一次性对所有关联记录求总和(sum)、求平均(average)、求最小值(minimum)或最大值(maximum)。
整型约束
默认情况下,数值约束允许使用小数。如果你只想允许整型值,可以使用 integer() 方法:
use Filament\Tables\Filters\QueryBuilder\Constraints\NumberConstraint;
NumberConstraint::make('stock')
->integer()
日期约束
日期约束(Date constraint)允许你过滤日期字段。可用于过滤任何日期字段,包括关联日期字段。
use Filament\Tables\Filters\QueryBuilder\Constraints\DateConstraint;
DateConstraint::make('created_at') // Filter the `created_at` column
DateConstraint::make('creatorCreatedAt')
->relationship(name: 'creator', titleAttribute: 'created_at') // Filter the `created_at` column on the `creator` relationship