管理关联
选择合适的工具
Filament 提供了多种在应用中管理管理的方法。选择哪个方式取决于你管理的关联类型和你希望的 UI 界面。
关联管理器 - 资源表单下方的交互式表格
NOTE
该方式兼容 HasMany
、HasManyThrough
、BelongsToMany
、MorphMany
和 MorphToMany
关联。
关联管理器是允许管理员在不离开资源的编辑页或查看页的情况下,罗列、创建、编辑、删除、关联、取消关联、附加、分离关联记录的互动式表格。、
Select & checkbox list - 从现有记录中选择或者创建新记录
NOTE
该方式兼容 BelongsTo
、MorphTo
和 BelongsToMany
关联。
使用 Select,用户可以从已有记录清单中进行选择。你页可以添加一个允许用户在模态框中创建新纪录的按钮,而无需离开页面。
当在 Select 中使用 BelongsToMany
关联时,你可以选择多个选项。记录会在你提交表单时,自动添加到中间表中。你也可以使用 Checkbox List替换多选下拉框。这两个组件的工作原理相同。
Repeater - 在表单中 CRUD 多个关联纪律
NOTE
该方式兼容 HasMany
和 MorphMany
关联。
Repeater是标准的表单组件,可以无限渲染一组可重复的字段。它们可以钩入到关联中,因此记录会自动从相关表中读取、创建、更新和删除。它们位于主表单 Schema 中,可以在资源页面中使用,也可以在嵌套到操作模态框中。
就用户体验角度而言,该方案只适合于关联模型中只有少数几个字段。否则,表单可能会变得非常长。
布局表单组件 - 保存表单字段到单个关联中
NOTE
该方式兼容 BelongsTo
、HasOne
和 MorphOne
关联。
所有布局表单组件(Grid、Section、Fieldset等)都由一个 relationship()
方法。当你使用这一方式,所有布局组件类的字段都将保存到关联模型而非所有者(owner)模型中:
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Fieldset;
Fieldset::make('Metadata')
->relationship('metadata')
->schema([
TextInput::make('title'),
Textarea::make('description'),
FileUpload::make('image'),
])
本例中,title
、description
和 image
自动从 metadata
关联中自动加载,并且在表单提交时再次保存。如果该 metadata
记录不存在,它将自动创建。
该特性在表单文档由更详尽深入的解释。请访问了解更多如何使用的信息。
创建关联管理器
要创建关联管理器,你可以使用 make:filament-relation-manager
命令:
php artisan make:filament-relation-manager CategoryResource posts title
CategoryResource
是所有者(父级)模型的资源类的名称。posts
是你想要管理的关联的名称。title
是你用以识别文章(post)的属性名。
这将创建一个 CategoryResource/RelationManagers/PostsRelationManager.php
文件。它包含一个你可以定义资源管理器的表单和表格的类:
use Filament\Forms;
use Filament\Schemas\Schema;
use Filament\Tables;
use Filament\Tables\Table;
public function form(Schema $schema): Schema
{
return $schema
->components([
Forms\Components\TextInput::make('title')->required(),
// ...
]);
}
public function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title'),
// ...
]);
}
你必须在资源的 getRelations()
方法中注册新的关联管理器:
public static function getRelations(): array
{
return [
RelationManagers\PostsRelationManager::class,
];
}
当关联管理器定义了表格和表单后,请访问资源的编辑页或查看页,以查看其实际操作。
只读模式
关联管理器通常显示在资源的“编辑”或“查看”页面上。在“查看”页面上,Filament 将自动隐藏修改关联的所有操作,如创建、编辑和删除。我们称之为“只读模式”,默认情况下,它保留了“查看”页面的只读行为。但是,你可以通过重写关联管理器类上的 isReadOnly()
方法使之始终返回 false
来禁用此行为:
public function isReadOnly(): bool
{
return false;
}
此外,如果你不喜欢该功能,你可以在面板配置中一次性禁用所有关联管理器的只读模式:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->readOnlyRelationManagersOnResourceViewPagesByDefault(false);
}
非常规的反转关联名
对于未遵循 Laravel 命名规范的反转关联,你可以在表格上使用 inverseRelationship()
方法:
use Filament\Tables;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title'),
// ...
])
->inverseRelationship('section'); // Since the inverse related model is `Category`, this is normally `category`, not `section`.
}
处理软删除
默认情况下,你将无法在关联管理器中与已删除的记录进行交互。如果你想在联管理器中添加恢复、强制删除和过滤垃圾记录的功能,请在生成关联管理器时使用 --soft deletes
标志:
php artisan make:filament-relation-manager CategoryResource posts title --soft-deletes
你可以在此处查阅更多软删除的信息。
列出关联记录
关联记录会在表格中列出。整个关联管理器都是基于此表格,包含创建、编辑、附加/分离、关联/取消关联和删除记录的操作。
你可以使用表格构造器的所有特性来自定义关联管理器。
使用中间表属性罗列
对于 BelongsToMany
和 MorphToMany
关联,你也可以添加中间表属性。比如你的 UserResource
资源有一个 TeamsRelationManager
关联,你想要添加 role
中间表属性到该表格,你可以使用:
use Filament\Tables;
public function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('name'),
Tables\Columns\TextColumn::make('role'),
]);
}
请确保所有的中间表属性都在关联及反转关联的 withPivot()
方法中列出。