BelongsToMany
You're browsing the documentation for an old version of MoonShine. Consider upgrading your project to MoonShine 2.x.
-
Sections
# Basics
Field for relationships in Laravel, BelongsToMany
type.
Displayed as a group of checkboxes, you can also transform into select multiple.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ];}//...
# Pivot
To implement pivot fields, use the fields()
method.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Contacts', 'contacts', 'name') ->fields([ Text::make('Contact', 'text'), ]) ];}//...
# Async search
Async search for values is provided by the asyncSearch()
method.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Contacts') ->asyncSearch()->fields([Text::make('Contact', 'text')]) ];}//...
The search will be performed on the resource relation field titleField
. The default is titleField=id
.
You can pass parameters to the asyncSearch()
method:
title
- search fieldcount
- amount of items in outputasyncSearchQuery()
- callback function for filtering valuesasyncSearchValueCallback()
- callback function for output customization.
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')]) ];}//...
When building a query in asyncSearchQuery()
, you can use the current form values.
To do this, you need to pass Request
to the callback functions.
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')); } ) ];}//...
Relations that use async search in their fields are recommended to be used in ResourceMode
.
Requests must be customized via the asyncSearch()
method,
don't use valuesQuery()
!
# Select
To transform the display into select, use the select()
method.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->select() ];}//...
# Values query
To filter values, use thevaluesQuery
method
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
Sometimes it makes sense to display checkboxes with a hierarchy, example for categories that have nesting,
there is a tree()
method for this.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->tree('parent_id') // Contact field // ];}//...
# onlyCount
If you want to display only the number of selected values on the index page,
then you should use the onlyCount()
method.
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->onlyCount() ];}//...
# inLine
By default, the index page will display the field as a table,
but if you want to display it in a line, you can use the inLine()
method.
Optional parameters can be passed to the method:
separator
- separator between elementsbadge
- display elements as badge
use MoonShine\Fields\BelongsToMany; //...public function fields(): array{ return [ BelongsToMany::make('Categories', 'categories', 'name') ->inLine(separator: ' ', badge: true) ];}//...