Поле HasOne
предназначено для работы с одноименной связью в Laravel и включает все Базовые методы.
HasOne::make(
Closure|string $label,
?string $relationName = null,
Closure|string|null $formatted = null,
ModelResource|string|null $resource = null,
)
HasOne::make(
Closure|string $label,
?string $relationName = null,
Closure|string|null $formatted = null,
ModelResource|string|null $resource = null,
)
HasOne::make(
Closure|string $label,
?string $relationName = null,
Closure|string|null $formatted = null,
ModelResource|string|null $resource = null,
)
HasOne::make(
Closure|string $label,
?string $relationName = null,
Closure|string|null $formatted = null,
ModelResource|string|null $resource = null,
)
HasOne::make(
Closure|string $label,
?string $relationName = null,
Closure|string|null $formatted = null,
ModelResource|string|null $resource = null,
)
$label
- метка, заголовок поля,
$relationName
- имя отношения,
$resource
- ModelResource
, на который ссылается отношение.
Параметр $formatted
не используется в поле HasOne
!
Наличие ModelResource
, на который ссылается отношение, обязательно.
Ресурс также необходимо зарегистрировать в сервис-провайдере MoonShineServiceProvider
в методе $core->resources()
.
В противном случае будет ошибка 500.
use App\MoonShine\Resources\ProfileResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make(
'Profile',
'profile',
resource: ProfileResource::class
)
namespaces
use App\MoonShine\Resources\ProfileResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make(
'Profile',
'profile',
resource: ProfileResource::class
)
use App\MoonShine\Resources\ProfileResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make(
'Profile',
'profile',
resource: ProfileResource::class
)
namespaces
use App\MoonShine\Resources\ProfileResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make(
'Profile',
'profile',
resource: ProfileResource::class
)
use App\MoonShine\Resources\ProfileResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make(
'Profile',
'profile',
resource: ProfileResource::class
)

Если вы не указываете $relationName
, тогда имя отношения будет определено автоматически на основе $label
(по правилам camelCase).
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile', 'profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile', 'profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile', 'profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile', 'profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile', 'profile')
Вы можете опустить $resource
, если ModelResource
совпадает с названием связи.
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile')
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Profile')
Метод fields()
позволяет указать, какие поля будут участвовать в preview или в построении форм.
fields(FieldsContract|Closure|iterable $fields)
fields(FieldsContract|Closure|iterable $fields)
fields(FieldsContract|Closure|iterable $fields)
fields(FieldsContract|Closure|iterable $fields)
fields(FieldsContract|Closure|iterable $fields)
use App\MoonShine\Resources\ProfileResource;
use MoonShine\UI\Fields\Relationships\HasOne;
use MoonShine\UI\Fields\Phone;
use MoonShine\UI\Fields\Text;
HasOne::make('Profile', resource: ProfileResource::class)
->fields([
Phone::make('Phone'),
Text::make('Address'),
])
namespaces
use App\MoonShine\Resources\ProfileResource;
use MoonShine\UI\Fields\Relationships\HasOne;
use MoonShine\UI\Fields\Phone;
use MoonShine\UI\Fields\Text;
HasOne::make('Profile', resource: ProfileResource::class)
->fields([
Phone::make('Phone'),
Text::make('Address'),
])
use App\MoonShine\Resources\ProfileResource;
use MoonShine\UI\Fields\Relationships\HasOne;
use MoonShine\UI\Fields\Phone;
use MoonShine\UI\Fields\Text;
HasOne::make('Profile', resource: ProfileResource::class)
->fields([
Phone::make('Phone'),
Text::make('Address'),
])
namespaces
use App\MoonShine\Resources\ProfileResource;
use MoonShine\UI\Fields\Relationships\HasOne;
use MoonShine\UI\Fields\Phone;
use MoonShine\UI\Fields\Text;
HasOne::make('Profile', resource: ProfileResource::class)
->fields([
Phone::make('Phone'),
Text::make('Address'),
])
use App\MoonShine\Resources\ProfileResource;
use MoonShine\UI\Fields\Relationships\HasOne;
use MoonShine\UI\Fields\Phone;
use MoonShine\UI\Fields\Text;
HasOne::make('Profile', resource: ProfileResource::class)
->fields([
Phone::make('Phone'),
Text::make('Address'),
])

Если у отношения есть ресурс, и вы хотите получить ID родительского элемента, то вы можете использовать трейт ResourceWithParent
.
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\Laravel\Traits\Resource\ResourceWithParent;
class PostImageResource extends ModelResource
{
use ResourceWithParent;
}
namespaces
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\Laravel\Traits\Resource\ResourceWithParent;
class PostImageResource extends ModelResource
{
use ResourceWithParent;
// ...
}
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\Laravel\Traits\Resource\ResourceWithParent;
class PostImageResource extends ModelResource
{
use ResourceWithParent;
// ...
}
namespaces
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\Laravel\Traits\Resource\ResourceWithParent;
class PostImageResource extends ModelResource
{
use ResourceWithParent;
// ...
}
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\Laravel\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';
}
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';
}
protected function getParentResourceClassName(): string
{
return PostResource::class;
}
protected function getParentRelationName(): string
{
return 'post';
}
Для получения ID родителя используйте метод getParentId()
.
$this->getParentId();
$this->getParentId();
$this->getParentId();
$this->getParentId();
$this->getParentId();
Preview
Метод modifyTable()
позволяет изменить TableBuilder
для предпросмотра.
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
use MoonShine\UI\Components\Table\TableBuilder;
HasOne::make('Comment', resource: CommentResource::class)
->modifyTable(
fn(TableBuilder $table) => $table
)
namespaces
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
use MoonShine\UI\Components\Table\TableBuilder;
HasOne::make('Comment', resource: CommentResource::class)
->modifyTable(
fn(TableBuilder $table) => $table
)
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
use MoonShine\UI\Components\Table\TableBuilder;
HasOne::make('Comment', resource: CommentResource::class)
->modifyTable(
fn(TableBuilder $table) => $table
)
namespaces
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
use MoonShine\UI\Components\Table\TableBuilder;
HasOne::make('Comment', resource: CommentResource::class)
->modifyTable(
fn(TableBuilder $table) => $table
)
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
use MoonShine\UI\Components\Table\TableBuilder;
HasOne::make('Comment', resource: CommentResource::class)
->modifyTable(
fn(TableBuilder $table) => $table
)
Форма
Метод modifyForm()
позволяет изменить FormBuilder
для редактирования.
use App\MoonShine\Resources\CommentResource;
use MoonShine\UI\Components\FormBuilder;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->modifyForm(
fn(FormBuilder $form) => $form->submit('Custom title')
)
namespaces
use App\MoonShine\Resources\CommentResource;
use MoonShine\UI\Components\FormBuilder;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->modifyForm(
fn(FormBuilder $form) => $form->submit('Custom title')
)
use App\MoonShine\Resources\CommentResource;
use MoonShine\UI\Components\FormBuilder;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->modifyForm(
fn(FormBuilder $form) => $form->submit('Custom title')
)
namespaces
use App\MoonShine\Resources\CommentResource;
use MoonShine\UI\Components\FormBuilder;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->modifyForm(
fn(FormBuilder $form) => $form->submit('Custom title')
)
use App\MoonShine\Resources\CommentResource;
use MoonShine\UI\Components\FormBuilder;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->modifyForm(
fn(FormBuilder $form) => $form->submit('Custom title')
)
Редирект после изменения
Метод redirectAfter()
позволяет редирект после сохранения/добавления/удаления.
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->redirectAfter(fn(int $parentId) => route('home'))
namespaces
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->redirectAfter(fn(int $parentId) => route('home'))
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->redirectAfter(fn(int $parentId) => route('home'))
namespaces
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->redirectAfter(fn(int $parentId) => route('home'))
use App\MoonShine\Resources\CommentResource;
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', resource: CommentResource::class)
->redirectAfter(fn(int $parentId) => route('home'))
Отображение внутри Tabs
Поля отношений в MoonShine по умолчанию отображаются внизу, отдельно от формы, и следуют друг за другом. Чтобы изменить отображение поля и добавить его в Tabs
, можно использовать метод tabMode()
.
tabMode(Closure|bool|null $condition = null)
tabMode(Closure|bool|null $condition = null)
tabMode(Closure|bool|null $condition = null)
tabMode(Closure|bool|null $condition = null)
tabMode(Closure|bool|null $condition = null)
В следующем примере будет создан компонент Tabs с двумя вкладками Comment и Cover.
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->tabMode(),
HasOne::make('Cover', 'cover', resource: CoverResource::class)
->tabMode()
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->tabMode(),
HasOne::make('Cover', 'cover', resource: CoverResource::class)
->tabMode()
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->tabMode(),
HasOne::make('Cover', 'cover', resource: CoverResource::class)
->tabMode()
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->tabMode(),
HasOne::make('Cover', 'cover', resource: CoverResource::class)
->tabMode()
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->tabMode(),
HasOne::make('Cover', 'cover', resource: CoverResource::class)
->tabMode()
tabMode не будет работать при использовании метода disableOutside()
Отображение внутри модального окна
Для того чтобы HasOne поле было отображено в модальном окне, которое вызывается по кнопке, можно использовать режим modalMode()
.
public function modalMode(
Closure|bool|null $condition = null,
?Closure $modifyButton = null,
?Closure $modifyModal = null
)
public function modalMode(
Closure|bool|null $condition = null,
?Closure $modifyButton = null,
?Closure $modifyModal = null
)
public function modalMode(
Closure|bool|null $condition = null,
?Closure $modifyButton = null,
?Closure $modifyModal = null
)
public function modalMode(
Closure|bool|null $condition = null,
?Closure $modifyButton = null,
?Closure $modifyModal = null
)
public function modalMode(
Closure|bool|null $condition = null,
?Closure $modifyButton = null,
?Closure $modifyModal = null
)
В данном примере вместо формы теперь будет ActionButton, который вызывает Modal.
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(),
Чтобы модифицировать ActionButton
и Modal
, можно воспользоваться параметрами метода $modifyButton
и $modifyModal
, в которые можно передать замыкание.
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(
modifyButton: function (ActionButtonContract $button, HasOne $ctx) {
$button->warning();
return $button;
},
modifyModal: function (Modal $modal, ActionButtonContract $ctx) {
$modal->autoClose(false);
return $modal;
}
)
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(
modifyButton: function (ActionButtonContract $button, HasOne $ctx) {
$button->warning();
return $button;
},
modifyModal: function (Modal $modal, ActionButtonContract $ctx) {
$modal->autoClose(false);
return $modal;
}
)
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(
modifyButton: function (ActionButtonContract $button, HasOne $ctx) {
$button->warning();
return $button;
},
modifyModal: function (Modal $modal, ActionButtonContract $ctx) {
$modal->autoClose(false);
return $modal;
}
)
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(
modifyButton: function (ActionButtonContract $button, HasOne $ctx) {
$button->warning();
return $button;
},
modifyModal: function (Modal $modal, ActionButtonContract $ctx) {
$modal->autoClose(false);
return $modal;
}
)
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->modalMode(
modifyButton: function (ActionButtonContract $button, HasOne $ctx) {
$button->warning();
return $button;
},
modifyModal: function (Modal $modal, ActionButtonContract $ctx) {
$modal->autoClose(false);
return $modal;
}
)
Отображение в основной форме ресурса
Для HasOne доступен метод disableOutside()
, который позволят отобразить его внутри формы на том месте, где задано данное поле. disableOutside
для HasOne работает только в режиме modalMode
.
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->disableOutside(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->disableOutside(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->disableOutside(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->disableOutside(),
use MoonShine\Laravel\Fields\Relationships\HasOne;
HasOne::make('Comment', 'comment', resource: CommentResource::class)
->disableOutside(),