Laravel 8 — сохранение нескольких выбранных флажков с отдельным полем в сводную таблицу

#php #laravel #pivot-table

#php #laravel #сводная таблица

Вопрос:

Предыстория:

Laravel 8 Bootstrap 5

Я извлекаю список категорий лицензий из базы данных в форму.

В форме пользователю предлагается указать, какую лицензию назначить пользователю. (до этого момента я в порядке)

Цель

Я бы хотел, чтобы дата истечения срока действия лицензии была назначена каждой выбранной категории.

Код

blade.php

 <div class="mb-1"><strong>Assign user's driving licence categories:</strong></div>
@foreach($categories as $category)
   <div class="input-group mb-3">
      <div class="input-group-text" style="width: 6ch !important;">{{$category->name}}</div>
      <div class="input-group-text">
         <input class="form-check-input" type="checkbox" name="categories[]" value="{{$category->id}}">
      </div>
   <div class="input-group-text">Expiry date</div>
      <input class="form-control" type="date" name="expiry_date[]">
   </div>
@endforeach
 

Скриншот формы

миграция сводной таблицы

     public function up()
    {
        Schema::create('driving_licence_category_user', function (Blueprint $table) {
            $table->id();
            $table->string('driving_licence_category_id');
            $table->string('user_id');
            $table->string('expiry_date')->nullable();
            $table->timestamps();
        });
    }
 

Модели

Пользователь

     public function drivingLicenceCategory()
    {
        return $this->belongsToMany('AppModelsDrivingLicenceCategory')
        ->withPivot('expiry_date')
        ->withTimestamps();
    }
 

Лицензия

     public function userHasDrivingLicenceCategory()
    {
        return $this->belongsToMany('AppModelsUser');
    }

 

Пользовательский контроллер

     public function store(Request $request)
    {
        $request->validate([
            'first_name' => 'required',
            'last_name' => 'required',
            'email' => 'required',
            'roles' => 'required',
            'categories' => 'required',
            'expiry_date' => 'required'
        ]);

        $user = User::create($request->except(['roles', 'categories', 'expiry_date']))
            ->syncRoles($request->roles)
            ->drivingLicenceCategory()->sync($request->only('categories'));

            //missing code to store the expiry_date information

        return redirect()->route('users.index')->with('success', 'User added successfully.');
    }
 

Спасибо, что потратили время на этот пост 🙂

Комментарии:

1. используйте updateExistingPivot() laravel.com/docs/8.x /…

2. Я мог бы использовать $user->roles()->sync([1 => ['expires' => true], 2, 3]); , но как получить запрос ввода для каждого флажка и поместить его в этот код??