Определять выбранные варианты на основе отношения "многие ко многим"

У меня есть три таблицы: товары, категории и категория_продукт.

На странице формы редактирования я показываю значения категорий и подкатегорий в поле выбора. Выбранные параметры категории сохраняются в сводной таблице category_product. В этой таблице есть product_id и category_id.

Вот мой код.

Модель продукта

public function category() {
  return $this->belongsToMany('App\Models\Category');
}

Категория модели:

public function products()
{
    return $this->belongsToMany(Product::class);
}

изменить вид страницы продукта:

<select name="category_id[]" class="form-control" multiple size = 10>
   @foreach ($parentCategories as $parentCategory)
       <option value="{{ $parentCategory->id }}">{{ $parentCategory->name }}</option>
       @if(count($parentCategory->subcategory))
         @include('includes.subcats-select',['subcategories' => $parentCategory->subcategory])
       @endif
   @endforeach
</select>

subcats-select view

@foreach($subcategories as $subcategory)
  <option value="{{ $subcategory->id }}">---{{ $subcategory->name }}</option>
    @if(count($subcategory->subcategory))
      @include('includes.subcats-select',['subcategories' => $subcategory->subcategory])
    @endif
  </div>
@endforeach

Как я могу поместить выбранный атрибут в параметры выбранной категории, чтобы при редактировании страницы правильно применить изменения?


person user2519032    schedule 25.05.2021    source источник


Ответы (1)


Вы можете получить столбцы сводной таблицы, следующие способ:

Модель продукта

public function category() {
  return $this->belongsToMany('App\Models\Category')->withPivot('selected');
}

редактировать страницу продукта Просмотр:

<select name="category_id[]" class="form-control" multiple size = 10>
   @foreach ($parentCategories as $parentCategory)
       <option value="{{ $parentCategory->id }}" selected="{{ $parentCategory->pivot->selected }}">
           {{ $parentCategory->name }}
       </option>
       @if(count($parentCategory->subcategory))
         @include('includes.subcats-select',['subcategories' => $parentCategory->subcategory])
       @endif
   @endforeach
</select>

ИЗМЕНИТЬ: хотя приведенный выше ответ может быть полезен другим, он не отвечает на вопрос. Итак, вот моя вторая попытка после некоторых разъяснений в чате.

<select name="category_id[]" class="form-control" multiple size = 10>
   @foreach ($parentCategories as $parentCategory)
       <option value="{{ $parentCategory->id }}"{{ $product->category->contains($parentCategory->id) ? 'selected' : '' }}>
           {{ $parentCategory->name }}
       </option>
       @if(count($parentCategory->subcategory))
         @include('includes.subcats-select',['subcategories' => $parentCategory->subcategory])
       @endif
   @endforeach
</select>
person shaedrich    schedule 25.05.2021
comment
Я обновил модель продукта и попробовал использовать ваш код, но получаю следующее сообщение об ошибке: «Пытаюсь получить свойство,« выбранное »не являющимся объектом. - person user2519032; 25.05.2021
comment
с dd ($ parentCategories) я получаю результат, но с dd ($ product-category) я получаю SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'category_product.selected' в 'списке полей' - person user2519032; 25.05.2021
comment
если я удалю - ›withPivot ('selected') из модели, dd ($ product-› category) будет работать нормально - person user2519032; 25.05.2021
comment
Ах, круто. Итак, теперь это работает? - person shaedrich; 25.05.2021
comment
нет, не работает. - person user2519032; 25.05.2021
comment
selected = {{$ parentCategory- ›pivot-› selected}} выдает экран ошибки. Попытка получить свойство 'selected' не-объекта - person user2519032; 25.05.2021
comment
Разве в вашей category_product таблице нет столбца selected? - person shaedrich; 25.05.2021
comment
Давайте продолжим это обсуждение в чате. - person user2519032; 25.05.2021
comment
Нет, я не выбрал столбец. Зачем мне? У меня есть category_id и product_id - person user2519032; 25.05.2021