- Основы
- Значение по умолчанию
- Nullable
- Placeholder
- Поиск значений
- Создание объекта отношения
- Запрос для значений
- Асинхронный поиск
- Связанные поля
- Значения с изображением
- Опции
- Нативный режим
Основы
Поле BelongsTo предназначено для работы с отношением того же имени в Laravel и включает все базовые методы.
Для создания этого поля используйте статический метод make()
.
BelongsTo::make(Closure|string $label,?string $relationName = null,Closure|string|null $formatted = null,?ModelResource $resource = null)
BelongsTo::make(Closure|string $label,?string $relationName = null,Closure|string|null $formatted = null,?ModelResource $resource = null)
$label
- метка, заголовок поля,$relationName
- имя отношения,$formatted
- замыкание или поле в связанной таблице для отображения значений,$resource
- ресурс модели, на который ссылается отношение.
Наличие ресурса модели, на который ссылается отношение, обязательно!
Ресурс также необходимо зарегистрировать в сервис-провайдере MoonShineServiceProvider в методе menu()
или resources()
. В противном случае будет ошибка 404.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country', resource: new CountryResource())];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country', resource: new CountryResource())];}//...
Если вы не указываете $relationName
, тогда имя отношения будет определено автоматически на основе $label
.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())];}//...
Вы можете опустить $resource
, если ресурс модели соответствует имени отношения.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country')];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country')];}//...
По умолчанию для отображения значения используется поле в связанной таблице, которое указано свойством $column
в ресурсе модели.
Аргумент $formatted
позволяет переопределить это.
namespace App\MoonShine\Resources;use MoonShine\Resources\ModelResource;class CountryResource extends ModelResource{//...public string $column = 'title';//...}
namespace App\MoonShine\Resources;use MoonShine\Resources\ModelResource;class CountryResource extends ModelResource{//...public string $column = 'title';//...}
Если вам нужно указать более сложное значение для отображения, тогда в аргумент $formatted
можно передать функцию обратного вызова.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country','country',fn($item) => "$item->id. $item->title")];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country','country',fn($item) => "$item->id. $item->title")];}//...
При использовании поля BelongsTo для сортировки или фильтрации позиций необходимо методом setColumn()
установить поле в таблице базы данных или переопределить метод sorting у ресурса модели.
Если вам нужно изменить column при работе с моделями, используйте метод onAfterFill
BelongsTo::make('Category',resource: new CategoryResource())->afterFill(fn($field) => $field->setColumn('changed_category_id'))
BelongsTo::make('Category',resource: new CategoryResource())->afterFill(fn($field) => $field->setColumn('changed_category_id'))
Значение по умолчанию
Вы можете использовать метод default()
, если вам нужно указать значение по умолчанию для поля.
default(mixed $default)
default(mixed $default)
Вы должны передать объект модели в качестве значения по умолчанию.
use App\Models\Country;use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())->default(Country::find(1))];}//...
use App\Models\Country;use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())->default(Country::find(1))];}//...
Nullable
Как и для всех полей, если вам нужно сохранить NULL, необходимо добавить метод nullable()
nullable(Closure|bool|null $condition = null)
nullable(Closure|bool|null $condition = null)
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())->nullable()];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())->nullable()];}//...
MoonShine - очень удобный и функциональный инструмент. Однако, чтобы его использовать, вам нужно быть уверенным в основах Laravel.
Не забудьте указать в таблице базы данных, что поле может принимать значение Null
.
Placeholder
Метод placeholder()
позволяет установить атрибут placeholder на поле.
placeholder(string $value)
placeholder(string $value)
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country')->nullable()->placeholder('Country')];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country')->nullable()->placeholder('Country')];}//...
Поиск значений
Если вам нужно искать среди значений, необходимо добавить метод searchable()
.
use MoonShine\Fields\BelongsTo;use App\MoonShine\Resources\CountryResource;//...public function fields(): array{return [BelongsTo::make('Country', 'country', new CountryResource())->searchable()];}//...
use MoonShine\Fields\BelongsTo;use App\MoonShine\Resources\CountryResource;//...public function fields(): array{return [BelongsTo::make('Country', 'country', new CountryResource())->searchable()];}//...
Создание объекта отношения
Метод creatable()
позволяет создать новый объект отношения через модальное окно.
creatable(Closure|bool|null $condition = null,?ActionButton $button = null,)
creatable(Closure|bool|null $condition = null,?ActionButton $button = null,)
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Author', resource: new AuthorResource())->creatable()];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Author', resource: new AuthorResource())->creatable()];}//...
Вы можете настроить кнопку создания, передав параметр button в метод.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Author', resource: new AuthorResource())->creatable(button: ActionButton::make('Custom button', ''))];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Author', resource: new AuthorResource())->creatable(button: ActionButton::make('Custom button', ''))];}//...
Запрос для значений
Метод valuesQuery()
позволяет изменить запрос для получения значений.
valuesQuery(Closure $callback)
valuesQuery(Closure $callback)
use Illuminate\Contracts\Database\Eloquent\Builder;use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Category', 'category', resource: new CategoryResource())->valuesQuery(fn(Builder $query, Field $field) => $query->where('active', true))];}//...
use Illuminate\Contracts\Database\Eloquent\Builder;use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Category', 'category', resource: new CategoryResource())->valuesQuery(fn(Builder $query, Field $field) => $query->where('active', true))];}//...
Асинхронный поиск
Для реализации асинхронного поиска значений используйте метод asyncSearch()
.
asyncSearch(string $asyncSearchColumn = null,int $asyncSearchCount = 15,?Closure $asyncSearchQuery = null,?Closure $asyncSearchValueCallback = null,?string $associatedWith = null,?string $url = null,bool $replaceQuery = false,)
asyncSearch(string $asyncSearchColumn = null,int $asyncSearchCount = 15,?Closure $asyncSearchQuery = null,?Closure $asyncSearchValueCallback = null,?string $associatedWith = null,?string $url = null,bool $replaceQuery = false,)
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country', resource: new CountryResource())->asyncSearch()];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country', resource: new CountryResource())->asyncSearch()];}//...
Поиск будет осуществляться по полю отношения ресурса column
. По умолчанию column=id
.
Вы можете передать параметры в метод asyncSearch()
:
$asyncSearchColumn
- поле, по которому осуществляется поиск;$asyncSearchCount
- количество элементов в результатах поиска;$asyncSearchQuery
- функция обратного вызова для фильтрации значений;$asyncSearchValueCallback
- функция обратного вызова для настройки вывода;$associatedWith
- поле, с которым устанавливается связь;$url
- url для обработки асинхронного запроса,$replaceQuery
- заменить запрос.
use Illuminate\Contracts\Database\Eloquent\Builder;use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country', resource: new CountryResource())->asyncSearch('title',10,asyncSearchQuery: function (Builder $query, Request $request, Field $field) {return $query->where('id', '!=', 2);},asyncSearchValueCallback: function ($country, Field $field) {return $country->id . ' | ' . $country->title;},'/async')];}//...
use Illuminate\Contracts\Database\Eloquent\Builder;use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', 'country', resource: new CountryResource())->asyncSearch('title',10,asyncSearchQuery: function (Builder $query, Request $request, Field $field) {return $query->where('id', '!=', 2);},asyncSearchValueCallback: function ($country, Field $field) {return $country->id . ' | ' . $country->title;},'/async')];}//...
При построении запроса в asyncSearchQuery()
вы можете использовать текущие значения формы. Для этого нужно передать Request
в callback функцию.
use Illuminate\Contracts\Database\Eloquent\Builder;use Illuminate\Http\Request;use MoonShine\Fields\Relationships\BelongsTo;use MoonShine\Fields\Select;//...public function fields(): array{return [Select::make('Country', 'country_id'),BelongsTo::make('City', 'city', resource: new CityResource())->asyncSearch('title',asyncSearchQuery: function (Builder $query, Request $request, Field $field): Builder {return $query->where('country_id', $request->get('country_id'));})];}//...
use Illuminate\Contracts\Database\Eloquent\Builder;use Illuminate\Http\Request;use MoonShine\Fields\Relationships\BelongsTo;use MoonShine\Fields\Select;//...public function fields(): array{return [Select::make('Country', 'country_id'),BelongsTo::make('City', 'city', resource: new CityResource())->asyncSearch('title',asyncSearchQuery: function (Builder $query, Request $request, Field $field): Builder {return $query->where('country_id', $request->get('country_id'));})];}//...
При построении запроса в asyncSearchQuery()
сохраняется исходное состояние builder.
Если вам нужно заменить его своим builder, тогда используйте флаг replaceQuery
.
use Illuminate\Contracts\Database\Eloquent\Builder;use Illuminate\Http\Request;use MoonShine\Fields\Relationships\BelongsTo;use MoonShine\Fields\Select;//...public function fields(): array{return [Select::make('Country', 'country_id'),BelongsTo::make('City', 'city', resource: new CityResource())->asyncSearch('title',asyncSearchQuery: function (Builder $query, Request $request, Field $field): Builder {return $query->where('country_id', $request->get('country_id'));},replaceQuery: true)];}//...
use Illuminate\Contracts\Database\Eloquent\Builder;use Illuminate\Http\Request;use MoonShine\Fields\Relationships\BelongsTo;use MoonShine\Fields\Select;//...public function fields(): array{return [Select::make('Country', 'country_id'),BelongsTo::make('City', 'city', resource: new CityResource())->asyncSearch('title',asyncSearchQuery: function (Builder $query, Request $request, Field $field): Builder {return $query->where('country_id', $request->get('country_id'));},replaceQuery: true)];}//...
Связанные поля
Для установления связи значений выбора между полями можно использовать метод associatedWith()
.
associatedWith(string $column, ?Closure $asyncSearchQuery = null)
associatedWith(string $column, ?Closure $asyncSearchQuery = null)
$column
- поле, с которым устанавливается связь;$asyncSearchQuery
- функция обратного вызова для фильтрации значений.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('City', 'city', resource: new CityResource())->associatedWith('country_id')];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('City', 'city', resource: new CityResource())->associatedWith('country_id')];}//...
Для более сложной настройки вы можете использовать asyncSearch()
.
Значения с изображением
Метод withImage()
позволяет добавить изображение к значению.
withImage(string $column,string $disk = 'public',string $dir = '')
withImage(string $column,string $disk = 'public',string $dir = '')
$column
- поле с изображением,$disk
- диск файловой системы,$dir
- директория относительно корня диска.
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make(Country, resource: new CountryResource())->withImage('thumb', 'public', 'countries')];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make(Country, resource: new CountryResource())->withImage('thumb', 'public', 'countries')];}//...
Опции
Все опции выбора доступны для изменения через атрибуты data:
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())->searchable()->customAttributes(['data-search-result-limit' => 5])];}//...
use MoonShine\Fields\Relationships\BelongsTo;//...public function fields(): array{return [BelongsTo::make('Country', resource: new CountryResource())->searchable()->customAttributes(['data-search-result-limit' => 5])];}//...
Для получения более подробной информации, пожалуйста, обратитесь к Choices.
Нативный режим
Метод native()
отключает библиотеку Choices.js и отображает выбор в нативном режиме
BelongsTo::make('Type')->native()
BelongsTo::make('Type')->native()