BelongsToMany
Вы просматриваете документацию старой версии MoonShine. Рассмотрите возможность обновления вашего проекта до MoonShine 2.x.
# Основы
Поле для отношений в Laravel типа BelongsToMany
.
Отображается как группа чекбоксов, также есть возможность трансформировать отображение в select multiple.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ];}//...
# Pivot
Для реализации pivot полей воспользуйтесь методом fields()
.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Contacts', 'contacts', 'name') ->fields([ Text::make('Contact', 'text'), ]) ];}//...
# Асинхронный поиск
Для реализации асинхронного поиска значений воспользуйтесь методом asyncSearch()
.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Contacts') ->asyncSearch()->fields([Text::make('Contact', 'text')]) ];}//...
Поиск будет осуществляться по полю отношения ресурса titleField
. По умолчанию titleField=id
.
В метод asyncSearch()
можно передавать параметры:
title
- поле по которому происходит поискcount
- количество элементов в выдачеasyncSearchQuery()
- callback-функция для фильтрации значенийasyncSearchValueCallback()
- callback-функция для кастомизации вывода.
use Illuminate\Contracts\Database\Eloquent\Builder; use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Contacts')->asyncSearch( 'title', 10, asyncSearchQuery: function (Builder $query) { return $query->where('id', '!=', 2); }, asyncSearchValueCallback: function ($contact) { return $contact->id . ' | ' . $contact->title; } )->fields([Text::make('Contact', 'text')]) ];}//...
При построении запроса в asyncSearchQuery()
можно использовать текущие значения формы.
Для этого необходимо передать Request
в callback-функции.
use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Http\Request; use MoonShine\Fields\BelongsToMany;use MoonShine\Fields\Select; //...public function fields(): array{ return [ Select::make('Country', 'country_id'), BelongsToMany::make('City')->asyncSearch( 'title', asyncSearchQuery: function (Builder $query, Request $request): Builder { return $query->where('country_id', $request->get('country_id')); } ) ];}//...
Отношения, которые применяют в своих полях асинхронный поиск, рекомендуется использовать в режиме ResourceMode
.
Запросы необходимо кастомизировать через метод asyncSearch()
,
не используйте valuesQuery()
!
# Select
Для трансформации отображения в select воспользуйтесь методом select()
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->select() ];}//...
# Запрос для значений
Для фильтрации значений воспользуйтесь методом valuesQuery
use Illuminate\Contracts\Database\Eloquent\Builder; use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->valuesQuery(fn(Builder $query) => $query->where('active', true)) ];}//...
# Tree
Иногда имеет смысл отобразить чекбоксы с иерархией, например для категорий,
которые имеют вложенность, для таких целей есть метод tree()
.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Категории', 'categories', 'name') ->tree('parent_id') // Поле для связи // ];}//...
# onlyCount
Если требуется отобразить на индексной странице только количество выбранных значений,
то следует воспользоваться методом onlyCount()
.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->onlyCount() ];}//...
# inLine
По умолчанию на индексной странице поле будет отображаться в виде таблицы,
но если требуется отобразить в строку то можно воспользоваться методом inLine()
.
Методу можно передать необязательные параметры:
separator
- разделитель между элементамиbadge
- отображать элементы в виде badge
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->inLine(separator: ' ', badge: true) ];}//...