A Laravel Nova field for polymorphic and non-polymorphic ManyToMany
relationships.
- Features
- Install
- Simple Usage
- Searching
- Pivots
- Duplicate Attachment
- Polymorphic Relation
- Fill Using
- Filter Related Resources
- Attach polymorphic and non-polymorphic
ManyToMany
relationships in the creation and update page - Edit pivot columns when attaching relation
- Attach a source to another resource many times
composer require armincms/many-to-many
use Armincms\Fields\BelongsToMany;
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
BelongsToMany::make(__("Label"), 'relationName', RelatedResource::class)
->fields(function() {
return [
Text::make('Price')
->rules('required', 'numeric'),
];
})
->pivots(),
];
}
To search relation value instead of select it; you can use the searchable
method on the field.
For customizing the pivot columns when attaching a resource you can use the pivots
method of the field. then define your custom pivot fields with the fields
method. now, when attaching a resource; a Modal that contains the pivot fields will be displayed to you.
In addition to the pivot columns, the pivot table should have its own id
column which must be mentioned in the model definition.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* The users that belong to the role.
*/
public function users()
{
return $this->belongsToMany(User::class)->withPivot('id', 'active', 'created_by');
}
}
use Armincms\Fields\BelongsToMany;
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
return [
BelongsToMany::make(__("Label"), 'relationName', RelatedResource::class)
->fields(function() {
return [
Text::make('Price')
->rules('required', 'numeric'),
];
})
->pivots(),
];
}
You can use the duplicate
feature for repetitively attach a resource to another resource. follow the example:
use Armincms\Fields\BelongsToMany;
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
return [
BelongsToMany::make(__("Label"), 'relationName', RelatedResource::class)
->fields(function() {
return [
Text::make('Price')
->rules('required', 'numeric'),
];
})
->duplicate(),
];
}
Using for the polymorphic relationships is like non-polymorphic. follow the example:
use Armincms\Fields\MorphToMany;
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
return [
MorphToMany::make(__("Label"), 'relationName', RelatedResource::class)
->fields(function() {
return [
Text::make('Price')
->rules('required', 'numeric'),
];
})
->duplicate()
->pivots(),
];
}
or
use Armincms\Fields\MorphedByMany;
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
return [
MorphedByMany::make(__("Label"), 'relationName', RelatedResource::class)
->fields(function() {
return [
Text::make('Price')
->rules('required', 'numeric'),
];
})
->duplicate()
->pivots(),
];
}
You can use fillUsing
to change the pivot-columns values; Then you need to return an associative array that matches your pivot table.
Be careful; the "fillUsing" method applies to each attachment. see the following example:
->fillUsing(function($pivots) {
if(isset($pivots['options']) && is_array($pivots['options'])) {
$pivots['options'] = json_encode($pivots['options']);
}
return $pivots;
}),
You can use withAttachableFilters
to add filters to get related resource options based on related resource attributes. See the following example:
use Armincms\Fields\MorphToMany;
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
return [
MorphToMany::make(__("Label"), 'relationName', RelatedResource::class)
->withAttachableFilters(['attribute1' => 'value1', 'attribute2' => 'value2']),
];
}