Основы
Поле HasOne предназначено для работы с отношением того же имени в Laravel и включает все базовые методы.
Для создания этого поля используйте статический метод make().
HasOne::make(Closure|string $label,?string $relationName = null,Closure|string|null $formatted = null,?ModelResource $resource = null)HasOne::make(Closure|string $label,?string $relationName = null,Closure|string|null $formatted = null,?ModelResource $resource = null)
$label - метка, заголовок поля,
$relationName - имя отношения,
$resource - ресурс модели, на который ссылается отношение
Параметр $formatted не используется в поле HasOne!
Наличие ресурса модели, на который ссылается отношение, обязательно!
Ресурс также необходимо зарегистрировать в сервис-провайдере MoonShineServiceProvider в методе menu() или resources(). В противном случае будет ошибка 404.
use MoonShine\Fields\Relationships\HasOne;//...public function fields(): array{return [HasOne::make('Profile', 'profile', resource: new ProfileResource())];}//...use MoonShine\Fields\Relationships\HasOne;//...public function fields(): array{return [HasOne::make('Profile', 'profile', resource: new ProfileResource())];}//...

Если вы не указываете $relationName, тогда имя отношения будет определено автоматически на основе $label.
use MoonShine\Fields\Relationships\HasOne;//...public function fields(): array{return [HasOne::make('Profile', resource: new ProfileResource())];}//...use MoonShine\Fields\Relationships\HasOne;//...public function fields(): array{return [HasOne::make('Profile', resource: new ProfileResource())];}//...
Вы можете опустить $resource, если ресурс модели соответствует имени отношения.
use MoonShine\Fields\Relationships\HasOne;//...public function fields(): array{return [HasOne::make('Profile', 'profile')];}//...use MoonShine\Fields\Relationships\HasOne;//...public function fields(): array{return [HasOne::make('Profile', 'profile')];}//...
Поля
Метод fields() позволяет указать, какие поля будут участвовать в preview или в построении форм.
fields(Fields|Closure|array $fields)fields(Fields|Closure|array $fields)
use MoonShine\Fields\Relationships\HasOne;use MoonShine\Fields\Phone;use MoonShine\Fields\Text;//...public function fields(): array{return [HasOne::make('Contacts', resource: new ContactResource())->fields([Phone::make('Phone'),Text::make('Address'),])];}//...use MoonShine\Fields\Relationships\HasOne;use MoonShine\Fields\Phone;use MoonShine\Fields\Text;//...public function fields(): array{return [HasOne::make('Contacts', resource: new ContactResource())->fields([Phone::make('Phone'),Text::make('Address'),])];}//...

ID родителя
Если у отношения есть ресурс, и вы хотите получить ID родительского элемента, то вы можете использовать трейт ResourceWithParent.
use MoonShine\Resources\ModelResource;use MoonShine\Traits\Resource\ResourceWithParent;class PostImageResource extends ModelResource{use ResourceWithParent;//...}use MoonShine\Resources\ModelResource;use MoonShine\Traits\Resource\ResourceWithParent;class PostImageResource extends ModelResource{use ResourceWithParent;//...}
При использовании трейта необходимо определить методы:
protected function getParentResourceClassName(): string{return PostResource::class;}protected function getParentRelationName(): string{return 'post';}protected function getParentResourceClassName(): string{return PostResource::class;}protected function getParentRelationName(): string{return 'post';}
Для получения ID родителя используйте метод getParentId().
$this->getParentId();$this->getParentId();
Рецепт: сохранение файлов связей HasMany в директории с ID родителя.