Filament дає три основні способи працювати зі зв'язками, і вибір залежить від типу зв'язку та обсягу даних.
1. Select / CheckboxList з relationship() - вибрати наявні записи прямо у формі. Підходить для BelongsTo, MorphTo і BelongsToMany:
Select::make('author_id')
->relationship('author', 'name')
->searchable()
->preload();
Select::make('tags')
->multiple()
->relationship(titleAttribute: 'name'); // зберігається в pivot-таблицю
Зміни зберігаються разом з основною формою.
2. Repeater з relationship() - редагувати кілька дочірніх записів (HasMany) усередині форми батька: позиції замовлення, телефони контакту. Добре, коли записів небагато і вони не мають сенсу окремо від батька.
3. Relation manager - окрема інтерактивна таблиця під формою редагування чи перегляду. Підтримує HasMany, HasManyThrough, BelongsToMany, MorphMany, MorphToMany:
php artisan make:filament-relation-manager CategoryResource posts title
public static function getRelations(): array
{
return [PostsRelationManager::class];
}
У ньому є пошук, фільтри, пагінація, дії створення, редагування, AttachAction/DetachAction, AssociateAction.
Як обирати:
| Ситуація | Інструмент |
|---|---|
| вибрати одного автора чи кілька тегів | Select |
| 2-10 залежних рядків, що редагуються разом з батьком | Repeater |
| десятки й сотні пов'язаних записів, потрібні пошук і пагінація | relation manager |
Що варто знати про relation managers:
- вони завантажуються ліниво і зберігають зміни одразу, а не разом із формою батька;
- на сторінці перегляду вони за замовчуванням лише для читання;
- фільтр списку в модальному вікні
AttachAction- це лише відображення. Обмежити, які записи взагалі можна приєднати, треба черезrecordSelectOptionsQuery(), інакше підроблений запит приєднає будь-який запис.