Поля

BelongsTo

Основы

Поле BelongsTo предназначено для работы с одноименной связью в Laravel и включает все Базовые методы.

BelongsTo::make(
Closure|string $label,
?string $relationName = null,
Closure|string|null $formatted = null,
ModelResource|string|null $resource = null,
)
  • $label - метка, заголовок поля,
  • $relationName - название связи,
  • $formatted - замыкание или поле в связанной таблице для отображения значений,
  • $resource - ModelResource, на которую ссылается связь.

Наличие ModelResource, на который ссылается отношение, обязательно. Ресурс также необходимо зарегистрировать в сервис-провайдере MoonShineServiceProvider в методе $core->resources(). В противном случае будет ошибка 500.

 namespaces
use App\MoonShine\Resources\UserResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make(
'User',
'user',
resource: UserResource::class
)

belongs_to belongs_to_dark

Вы можете опустить $resource, если ModelResource совпадает с названием связи.

use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('User', 'user')

Если не указать $relationName, то имя связи будет определено автоматически на основе $label (по правилам camelCase).

use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('User')

По умолчанию для отображения значения используется поле в связанной таблице, которое указано свойством $column в ModelResource. Аргумент $formatted позволяет переопределить свойство $column.

use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make(
'User',
'user',
formatted: 'first_name'
)

Если необходимо указать более сложное значение для отображения, то в аргумент $formatted можно передать функцию обратного вызова.

use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make(
'Country',
'country',
fn($item) => "$item->id. $item->title"
)

Если необходимо изменить колонку при работе с моделями, используйте метод onAfterFill().

 namespaces
use App\MoonShine\Resources\CategoryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make(
'Category',
resource: CategoryResource::class
)
->afterFill(
fn($field) => $field->setColumn('changed_category_id')
)

Значение по умолчанию

Вы можете использовать метод default(), если вам нужно указать значение по умолчанию для поля.

default(mixed $default)

Вы должны передать объект модели в качестве значения по умолчанию.

 namespaces
use App\MoonShine\Resources\CategoryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Country', resource: CategoryResource::class)
->default(Country::find(1))

Nullable

Как и для всех полей, если необходимо хранить NULL, нужно добавить метод nullable().

nullable(Closure|bool|null $condition = null)
 namespaces
use App\MoonShine\Resources\CategoryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Country', resource: CategoryResource::class)
->nullable()

select_nullable select_nullable_dark

Не забудьте указать в таблице базы данных, что поле может принимать значение Null.

Подсказка

Метод placeholder() позволяет установить атрибут placeholder у поля.

placeholder(string $value)
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Country', 'country')
->nullable()
->placeholder('Country')

Поиск значений

Если необходимо осуществлять поиск среди значений, нужно добавить метод searchable().

 namespaces
use App\MoonShine\Resources\CountryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Country', 'country', resource: CountryResource::class)
->searchable()

Создание объекта связи

Метод creatable() позволяет создать новый объект связи через модальное окно.

creatable(
Closure|bool|null $condition = null,
?ActionButton $button = null,
)
BelongsTo::make('Author', resource: AuthorResource::class)
->creatable()

belongs_to_creatable belongs_to_creatable_dark

Вы можете настроить кнопку создания, передав параметр button в метод.

 namespaces
use App\MoonShine\Resources\AuthorResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
use MoonShine\UI\Components\ActionButton;
 
BelongsTo::make('Author', resource: AuthorResource::class)
->creatable(
button: ActionButton::make('Custom button', '')
)

Запрос для значений

Метод valuesQuery() позволяет изменить запрос для получения значений.

valuesQuery(Closure $callback)
 namespaces
use App\MoonShine\Resources\CategoryResource;
use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
use MoonShine\UI\Fields\Field;
 
BelongsTo::make('Category', 'category', resource: CategoryResource::class)
->valuesQuery(fn(Builder $query, Field $field) => $query->where('active', true))

Для реализации асинхронного поиска значений используйте метод asyncSearch().

asyncSearch(
string $column = null,
?Closure $searchQuery = null,
?Closure $formatted = null,
?string $associatedWith = null,
int $limit = 15,
?string $url = null,
)
 namespaces
use App\MoonShine\Resources\CategoryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Category', 'category', resource: CategoryResource::class)
->asyncSearch()

Поиск будет осуществляться по полю связи ресурса column. По умолчанию column=id.

Вы можете передать параметры в метод asyncSearch():

  • $column - поле, по которому осуществляется поиск,
  • $searchQuery - функция обратного вызова для фильтрации значений,
  • $formatted - функция обратного вызова для настройки вывода,
  • $associatedWith - поле, с которым установить связь,
  • $limit - количество элементов в результатах поиска,
  • $url - url для обработки асинхронного запроса.
 namespaces
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use MoonShine\UI\Fields\Field;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Category', 'category', resource: CategoryResource::class)
->asyncSearch(
'title',
searchQuery: function (Builder $query, Request $request, Field $field) {
return $query->where('id', '!=', 2);
},
formatted: function ($country, Field $field) {
return $country->id . ' | ' . $country->title;
},
limit: 10,
url: 'https://moonshine-laravel.com/async'
)

При построении запроса в searchQuery можно использовать текущие значения формы. Для этого необходимо передать Request в функцию обратного вызова.

 namespaces
use App\MoonShine\Resources\CityResource;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
use MoonShine\UI\Fields\Field;
use MoonShine\UI\Fields\Select;
 
Select::make('Country', 'country_id'),
 
BelongsTo::make('City', 'city', resource: CityResource::class)
->asyncSearch(
'title',
searchQuery: function (Builder $query, Request $request, Field $field): Builder {
return $query->where('country_id', $request->get('country_id'));
}
)

При построении запроса в searchQuery сохраняется исходное состояние построителя. Если вам нужно заменить его своим построителем, то используйте флаг replaceQuery.

 namespaces
use App\MoonShine\Resources\CityResource;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
use MoonShine\UI\Fields\Field;
use MoonShine\UI\Fields\Select;
 
Select::make('Country', 'country_id'),
 
BelongsTo::make('City', 'city', resource: CityResource::class)
->asyncSearch(
'title',
searchQuery: function (Builder $query, Request $request, Field $field): Builder {
return $query->where('country_id', $request->get('country_id'));
},
replaceQuery: true
)

Связанные поля

Для установления связи значений выбора между полями можно использовать метод associatedWith().

associatedWith(string $column, ?Closure $searchQuery = null)
  • $column - поле, с которым устанавливается связь,
  • $searchQuery - функция обратного вызова для фильтрации значений.
 namespaces
use App\MoonShine\Resources\CityResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('City', 'city', resource: CityResource::class)
->associatedWith('country_id')

Для более сложной настройки вы можете использовать asyncSearch().

Значения с изображением

Метод withImage() позволяет добавить изображение к значению.

withImage(
string $column,
string $disk = 'public',
string $dir = ''
)
  • $column - поле с изображением,
  • $disk - диск файловой системы,
  • $dir - директория относительно корня диска.
 namespaces
use App\MoonShine\Resources\CountryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Country', resource: CountryResource::class)
->withImage('thumb', 'public', 'countries')

belongs_to_image belongs_to_image_dark

Опции

Все опции выбора доступны для изменения через атрибуты data:

 namespaces
use App\MoonShine\Resources\CountryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Country', resource: CountryResource::class)
->searchable()
->customAttributes([
'data-search-result-limit' => 5
])

Для получения более подробной информации, пожалуйста, обратитесь к Choices.

Нативный режим

Метод native() отключает библиотеку Choices.js и отображает выбор в нативном режиме.

use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make('Type')->native()

По умолчанию BelongsTo ссылается на страницу редактирования. Вы можете переопределить это поведение с помощью метода link().

 namespaces
use App\MoonShine\Resources\CategoryResource;
use MoonShine\Laravel\Fields\Relationships\BelongsTo;
 
BelongsTo::make(
'Category',
'category',
resource: CategoryResource::class,
)
->link(
link: fn(string $value, BelongsTo $ctx) => $ctx->getResource()->getDetailPageUrl($ctx->getData()->getKey()),
name: fn(string $value) => $value,
icon: 'users',
blank: true,
)