Laravel Community Tools by Tighten
Laravel Nova icon Nova Packages
P

polymorphic and non-polymorphic ManyToMany field

Readme

ManyToMany

A Laravel Nova field for polymorphic and non-polymorphic ManyToMany relationships.

Table of Contents

Features

  • 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

Install

composer require armincms/many-to-many

Simple Usage

  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(),
    ];
  }

Searching

To search relation value instead of select it; you can use the searchable method on the field.

Pivots

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(),
    ];
  }

Duplicate Attachment

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(),
    ];
  }

Polymorphic Relation

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(),
    ];
  }

Fill Using

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;
  }), 

Filter Related Resources

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']),
    ];
  }

Screenshots

Reviews

By AArmin on April 2, 2020

Great idea, needs just a bit of polish for 5 stars, but solid package in general.

Back to Top
Added 6 years ago
Last updated 2 Years Ago
Version 1.2.1
Nova Version ^4.0
Composer
armincms/many-to-many
GitHub stars 25
Packagist downloads 72,241

Favorites

8 users favorited

Rating

4.50
(out of 5)
★★★★★
★★★★
★★★
★★
2 ratings

Contributors

Brought to you by Tighten

Issues/Feature Requests Stats Package Ideas