Основы
Поле 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();
Рецепт: сохранение файлов связей HasMany в директории с ID родителя.