Поля

HasOne

Основы

Поле 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())
];
}
 
//...

has_one has_one_dark

Если вы не указываете $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'),
])
];
}
 
//...

has_one_preview has_one_preview_dark

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 родителя.