Поддержка
Поля

Отношения

Поля для связей между моделями — HasOne, HasMany, BelongsTo, BelongsToMany и полиморфные связи

Поля отношений связывают ресурсы между собой. Каждый тип соответствует аналогичной Eloquent-связи. Второй аргумент — класс ресурса связанной модели, третий (опциональный) — подпись в интерфейсе.

HasOne

Связь «один к одному». Документация Laravel — One to one.

У User одна запись Profile. В UserResource:

app/Frame/Resources/UserResource.php
HasOne::make('profile', ProfileResource::class, 'Profile')

Обратная сторона — в ProfileResource:

app/Frame/Resources/ProfileResource.php
BelongsTo::make('user', UserResource::class, 'User')

Сигнатура: make(string $field, string $resourceClass, ?string $label = null).

HasMany

Связь «один ко многим». Документация — One to many.

У Excursion — несколько Guide. В ExcursionResource:

app/Frame/Resources/ExcursionResource.php
HasMany::make('guides', GuideResource::class, 'Guides')

BelongsTo

Обратная сторона для HasOne и HasMany. Документация — One to many inverse.

HasOneThrough

Связь «один к одному» через промежуточную модель. Документация — Has one through.

HasOneThrough::make('postColor', PostColorResource::class, 'Post color')

HasManyThrough

Связь «один ко многим» через промежуточную модель. Документация — Has many through.

HasManyThrough::make('guides', GuideResource::class, 'Guides')

BelongsToMany

Связь «многие ко многим». Документация — Many to many.

У User — несколько Group, у Group — несколько User. В UserResource:

app/Frame/Resources/UserResource.php
BelongsToMany::make('groups', GroupResource::class, 'Groups')
    ->fields([
        Text::make('role', 'Role'),
    ])

Обратная сторона в GroupResource:

app/Frame/Resources/GroupResource.php
BelongsToMany::make('users', UserResource::class, 'Users')
    ->fields([
        Text::make('role', 'Role')
            ->required()
            ->placeholder('User'),
    ])

Метод fields() описывает поля промежуточной (pivot) таблицы. Пример схемы:

users
    id - integer
    name - string
groups
    id - integer
    name - string
group_user
    id - integer
    group_id - integer
    user_id - integer
    role - string

Если промежуточная таблица содержит только ключи — fields() можно опустить.

MorphOne / MorphTo

Полиморфная связь «один к одному». Документация — Polymorphic one-to-one.

У Office один Address, но Address может принадлежать и другим моделям (Shop, Hospital).

В OfficeResource:

app/Frame/Resources/OfficeResource.php
MorphOne::make('address', AddressResource::class, 'Address')

Обратная сторона в AddressResource:

app/Frame/Resources/AddressResource.php
MorphTo::make('addressable', [
    OfficeResource::class,
    ShopResource::class,
], 'Entities')

Второй аргумент MorphTo — массив ресурсов возможных родителей, третий (опциональный) — подпись в интерфейсе.

MorphMany

Полиморфная связь «один ко многим». Документация — Polymorphic one-to-many.

app/Frame/Resources/PostResource.php
MorphMany::make('comments', CommentResource::class, 'Comments')
    ->hideOnIndex()

Обратная сторона в CommentResource:

app/Frame/Resources/CommentResource.php
MorphTo::make('commentable', [
    PostResource::class,
    SpaceResource::class,
], 'Запись')

MorphToMany

Полиморфная связь «многие ко многим». Документация — Polymorphic many-to-many.

app/Frame/Resources/PostResource.php
MorphToMany::make('tags', TagResource::class, 'Tags')

Inline-создание связанных записей

Метод inlineCreate() позволяет создать связанную запись прямо из селекта — без ухода со страницы формы. Фронтенд показывает кнопку «+ Создать» в выпадающем списке; по клику открывается модальное окно с формой создания связанного ресурса.

app/Frame/Resources/PostResource.php
BelongsTo::make('type', PostTypeResource::class, 'Тип')
    ->inlineCreate(),

BelongsTo::make('source', PostSourceResource::class, 'Источник')
    ->inlineCreate(),

Поддерживаемые связи

  • Single (BelongsTo, HasOne, MorphTo, MorphOne) — inline-создание доступно всегда.
  • Listable (HasMany, BelongsToMany, MorphMany, MorphToMany) — только при отображении через ->asTag().
  • Through (HasOneThrough, HasManyThrough) — не поддерживается (нужна промежуточная запись).

Контроль доступа

Кнопка появляется только если у пользователя есть право на создание целевого ресурса. Проверка делается через canCreate() ресурса, который дёргает Gate-ability вида <resource-name>.create:

  • PostTypeResource::name()post-types → проверяется post-types.create
  • PostSourceResource::name()post-sourcespost-sources.create

Если вы используете модуль permissions с ResourcePermissions::forResource(), ability генерируется автоматически — достаточно раздать её роли. Без прав — флаг inline_create в ответе API будет false, кнопка скрыта.

Для переопределения правил создания отдельного ресурса определите Policy или переопределите canCreate() в классе ресурса.

Relation

Родительский класс для всех полей отношений. В ресурсах не используется напрямую — наследуйте от него для собственных типов связей.