# Основы
Поле HasOne предназначено для работы с одноименным отношением в Laravel и включает в себя все базовые методы.
Для создания данного поля используется статический метод make()
.
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()) ];} //...
Если не указать $relationName
,
то название отношения будет определено автоматически на основе $label
.
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') ];} //...
# Поля
Метод fields()
позволяет задать какие поля будут участвовать в preview или в построении форм.
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'), ]) ];} //...
# ID родителя
Если у связи есть ресурс, и необходимо получить ID родительского элемента, то можно воспользоваться трейтом 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';}
Для получения ID родителя используется метод getParentId()
.
$this->getParentId();
Рецепт: сохранение файлов в директории с ID родителя.