BelongsTo
Вы просматриваете документацию старой версии MoonShine. Рассмотрите возможность обновления вашего проекта до MoonShine 2.x.
# Основы
Поле для отношений в Laravel типа BelongsTo
. Отображается как поле select.
use MoonShine\Fields\BelongsTo; //...public function fields(): array{ return [ // с указанием отношения BelongsTo::make('Country', 'country', 'name') // или можно поле BelongsTo::make('Country', 'country_id', 'name') ];}//...
Третий аргумент со значением "name" является полем в связанной таблице countries для отображения значений.
Также третьим параметром можно передать ресурс, у которого указано поле для отображения.
use MoonShine\Fields\BelongsTo;use App\MoonShine\Resources\CountryResource; //...public function fields(): array{ return [ BelongsTo::make('Country', 'country', new CountryResource()) ];}//...
namespace App\MoonShine\Resources; use MoonShine\Resources\Resource;use App\Models\Country; class CountryResource extends Resource{ //... public string $titleField = 'name'; //...}
Если необходимо более сложное значение для отображения, то в третий аргумент можно передать функцию.
use MoonShine\Fields\BelongsTo; //...public function fields(): array{ return [ BelongsTo::make( 'Country', 'country', fn($item) => "$item->id.) $item->name" ) ];}//...
# Поиск значений
Если необходим поиск среди значений, то нужно добавить метод searchable()
.
use MoonShine\Fields\BelongsTo;use App\MoonShine\Resources\CountryResource; //...public function fields(): array{ return [ BelongsTo::make('Country', 'country', new CountryResource()) ->searchable() ];}//...
# Асинхронный поиск
Для реализации асинхронного поиска значений воспользуйтесь методом asyncSearch()
.
use MoonShine\Fields\BelongsTo; //...public function fields(): array{ return [ BelongsTo::make('Contacts') ->asyncSearch() ];}//...
Поиск будет осуществляться по полю отношения ресурса titleField
. По умолчанию titleField=id
.
В метод asyncSearch()
можно передавать параметры:
title
- поле по которому происходит поискcount
- количество элементов в выдачеasyncSearchQuery()
- callback-функция для фильтрации значенийasyncSearchValueCallback()
- callback-функция для кастомизации вывода.
use Illuminate\Contracts\Database\Eloquent\Builder; use MoonShine\Fields\BelongsTo; //...public function fields(): array{ return [ BelongsTo::make('Contacts')->asyncSearch( 'title', 10, asyncSearchQuery: function (Builder $query) { return $query->where('id', '!=', 2); }, asyncSearchValueCallback: function ($contact) { return $contact->id . ' | ' . $contact->title; } ) ];}//...
При построении запроса в asyncSearchQuery()
можно использовать текущие значения формы.
Для этого необходимо передать Request
в callback-функции.
use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Http\Request; use MoonShine\Fields\BelongsTo;use MoonShine\Fields\Select; //...public function fields(): array{ return [ Select::make('Country', 'country_id'), BelongsTo::make('City')->asyncSearch( 'title', asyncSearchQuery: function (Builder $query, Request $request): Builder { return $query->where('country_id', $request->get('country_id')); } ) ];}//...
Отношения, которые применяют в своих полях асинхронный поиск, рекомендуется использовать в режиме ResourceMode
.
# Запрос для значений
Для фильтрации значений воспользуйтесь методом valuesQuery
use Illuminate\Contracts\Database\Eloquent\Builder; use MoonShine\Fields\BelongsTo; //...public function fields(): array{ return [ BelongsTo::make('Categories', 'categories', 'name') ->valuesQuery(fn(Builder $query) => $query->where('active', true)) ];}//...
# Пустое значение
Если необходимо по умолчанию значение Null
use MoonShine\Fields\BelongsTo; //...public function fields(): array{ return [ BelongsTo::make('Country', 'country') ->nullable() ];}//...
Не забудьте также в таблице базы данных указать, что поле может быть Null
.