BelongsToMany

Вы просматриваете документацию старой версии MoonShine. Рассмотрите возможность обновления вашего проекта до MoonShine 2.x.

Наследует Select * имеет те же возможности

# Основы

Поле для отношений в 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)
];
}
//...