Search code examples
crudcustom-field-typelaravel-backpack

How to use extra column in a pivot table


I need to make a custom field just like checklist, but in a table and with a second field "order".
This is what I have:

  • Model 1: Conditions with relations "belongsToMany"
  • Model 2: SubServices

These two models are in relations with the table products_service that has the two foreign_keys plus the column "order"

What I can't understand is:
How could save the extra information with backpack.

I know that I can use something like this:

$user->roles()->updateExistingPivot($roleId, $attributes);

but where should I put it?

Here's my code:

class Condition extends Model
{
  use CrudTrait;
  use Searchable;

  public function relService()
  {
    //dd($this->belongsToMany(SubService::class, 'conditions_service')->withPivot('weight')->withTimestamps());
            return $this->belongsToMany(SubService::class, 'conditions_service')->withPivot('weight')->withTimestamps();
  }
}

class SubService extends Model
{
  use Searchable;
  use CrudTrait;

  public function conditions()
  {
    return $this->belongsToMany(Condition::class, 'conditions_service')->withPivot('weight')->withTimestamps();
  }
}

Here's my Custom Field Type:

<!-- select2 -->
<div @include('crud::inc.field_wrapper_attributes') >
    <label>{!! $field['label'] !!}</label>
    @include('crud::inc.field_translatable_icon')
    <?php $entity_model = $crud->getModel(); ?>

    <div class="row">
        <div class="col-sm-12">
            <table id="crudTable" class="table table-bordered table-striped display">
                <thead>
                <tr>
                    @if ($crud->details_row)
                        <th></th> <!-- expand/minimize button column -->
                    @endif

                    {{-- Table columns --}}
                    <th>Seleziona</th>
                    <th>Ordine</th>
                    {{--<th>Ordine <i class="fa fa-arrow-up" aria-hidden="true"></i></th>
                    <th>Ordine <i class="fa fa-arrow-down" aria-hidden="true"></i></th>--}}
                    {{--$tst = $connected_entity_entry->relService->whereIn('id', $connected_entity_entry->id)--}}
                </tr>
                </thead>
                <tbody>
                @foreach ($field['model']::all() as $connected_entity_entry) {{--var_dump((empty($connected_entity_entry->conditions->toArray())?"puppa":(empty($connected_entity_entry->conditions->whereIn('id', $connected_entity_entry->id)->toArray())?"puppa uguale":$connected_entity_entry->conditions->whereIn('id', $connected_entity_entry->id)))) --}}
                {{-- dump($connected_entity_entry->getPriority($connected_entity_entry->id)) --}}
                <tr>
                    <th scope="row">
                        <div class="col-sm-4">
                            <div class="checkbox">
                                <label>
                                    <input type="checkbox"
                                           name="{{ $field['name'] }}[]"
                                           value="{{ $connected_entity_entry->id }}"

                                           @if( ( old( $field["name"] ) && in_array($connected_entity_entry->id, old( $field["name"])) ) || (isset($field['value']) && in_array($connected_entity_entry->id, $field['value']->pluck('id', 'id')->toArray())))
                                           checked="checked"
                                            @endif > {!! $connected_entity_entry->{$field['attribute']} !!}
                                </label>
                            </div>
                        </div>
                    </th>
                    <td>{{--@include('crud::fields.number')--}}

                    </td>
                </tr>
                @endforeach
                </tbody>
            </table>
        </div>

        {{-- HINT --}}
        @if (isset($field['hint']))
            <p class="help-block">{!! $field['hint'] !!}</p>
        @endif
    </div>
</div>

Thank you for your help! Dave


Solution

  • I found a solution thanks dense-team with his pull request (https://github.com/Laravel-Backpack/CRUD/pull/351)

    Here's my code updated:

    CrudController:

    $this->crud->addField([
            'label'     => 'Servizi legati',
            'type'      => 'checklist_ordered',
            'name'      => 'relService',
            'entity'    => 'relService',
            'attribute' => 'title',
            'model'     => "App\Models\SubService",
            'pivot'     => true,
            'pivotFields' => [
                'weight' => 'Ordinamento',
            ],
        ], 'update/create/both');
    

    Here's my Custom Field Type:

    <!-- select2 -->
    <div @include('crud::inc.field_wrapper_attributes') >
        <label>{!! $field['label'] !!}</label>
        @include('crud::inc.field_translatable_icon')
        @if (isset($field['model']))
            <?php $entity_model = $crud->getModel();
    
            $pivot_entries = null;
            if (isset($entry)) {
                $pivot_entries = $entry->{$field['entity']}->keyBy(function ($item) {
                    return $item->getKey();
                });
            }
            ?>
            <div class="row">
                <div class="col-sm-12">
                    <table id="crudTable" class="table table-bordered table-striped display">
                        <thead>
                        <tr>
                            @if ($crud->details_row)
                                <th></th> <!-- expand/minimize button column -->
                            @endif
    
                            {{-- Table columns --}}
                            <th>Seleziona</th>
                            @foreach($field['pivotFields'] as $pivot_chunk)
                                <th>{{$pivot_chunk}}</th>
                            @endforeach
    
                        </tr>
                        </thead>
                        <tbody>
                        @foreach ($field['model']::all() as $connected_entity_entry) 
                        <tr>
                            <th scope="row">
                                <div class="col-sm-4">
                                    <div class="checkbox">
                                        <label>
                                            <input type="checkbox"
                                                   name="{{ $field['name'] }}[]"
                                                   value="{{ $connected_entity_entry->id }}"
    
                                                   @if( ( old( $field["name"] ) && in_array($connected_entity_entry->id, old( $field["name"])) ) || (isset($field['value']) && in_array($connected_entity_entry->id, $field['value']->pluck('id', 'id')->toArray())))
                                                   checked="checked"
                                                    @endif > {!! $connected_entity_entry->{$field['attribute']} !!}
                                        </label>
                                    </div>
                                </div>
                            </th>
                            <td>
                                @foreach(array_chunk($field['pivotFields'], 2, true) as $pivot_chunk)
                                    @foreach ($pivot_chunk as $pivot_field => $pivot_name)
                                        <?php
                                        $pivot_attr = null;
                                        if ($pivot_entries) {
                                            if ($pivot_entries->has($connected_entity_entry->getKey())) {
                                                $pivot      = $pivot_entries->get($connected_entity_entry->getKey())->pivot;
                                                $pivot_attr = $pivot->getAttribute($pivot_field);
                                            }
                                        }
                                        ?>
                                        <input type="number"
                                               name="{!! $pivot_field !!}[{{ $connected_entity_entry->getKey() }}]"
                                               value="{{ $pivot_attr }}" @include('crud::inc.field_attributes') />
                                    @endforeach
                                @endforeach
                            </td>
                        </tr>
                        @endforeach
                        </tbody>
                    </table>
                </div>
                @endif
                {{-- HINT --}}
                @if (isset($field['hint']))
                    <p class="help-block">{!! $field['hint'] !!}</p>
                @endif
            </div>
    </div>