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())
];
}
 
//...

Если не указать $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 родителя.