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

#php #laravel #eloquent #laravel-8 #eloquent-relationship

Вопрос:

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

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

Вот мой код.

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

 public function category() {
  return $this->belongsToMany('AppModelsCategory');
}
 

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

 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>
 

подкаты-выберите просмотр

 @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
 

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

Ответ №1:

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

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

 public function category() {
  return $this->belongsToMany('AppModelsCategory')->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>
 

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

1. Я обновил модель продукта и попытался использовать ваш код, но я получаю эту ошибку: пытаюсь получить свойство «выбрано» не-объекта.

2. Так $parentCategory и есть $product->category ?

3. с dd($Родительские категории) Я получаю результат, но с dd($product-категория) Я получаю SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец «category_product.selected» в «списке полей»

4. если я удалю ->withPivot («выбранный») из модели, dd($product->>категория) будет работать нормально

5. selected=»{{ $ParentCategory->pivot->>selected }}» выдает экран ошибки При попытке получить свойство «выбрано» не-объекта