У меня проблема с получением параметров продуктов, которые они отображают в отдельных полях вместо группировки.
Логика
- Группа параметров получает тип и значения
- Параметры принадлежатв группы также к продуктам
- Товары получают Опции
Модели
Product
public function options(){
return $this->belongsToMany(Option::class, 'product_options', 'product_id', 'option_id');
}
Option Group
public function values(){
return $this->hasMany(Option::class, 'option_id');
}
Option
public function group(){
return $this->belongsTo(OptionGroup::class, 'option_id');
}
public function products(){
return $this->belongsToMany(Product::class);
}
Вид лезвия
@if(count($product->options)>0)
<!-- options -->
<div class="tt-swatches-container">
<div class="tt-wrapper">
@foreach($product->options as $option)
<div class="tt-title-options">{{$option->group->title}}:</div>
@if($option->group->type == 'color')
<ul class="tt-options-swatch options-large">
<li><a class="options-color" style="background-color: {{$option->color}}" href="#"></a></li>
</ul>
@elseif($option->group->type == 'dropdown')
<form class="form-default">
<div class="form-group">
<select class="form-control">
<option>{{$option->title}}</option>
</select>
</div>
</form>
@else
<ul class="tt-options-swatch options-large">
<li><a href="#">{{$option->title}}</a></li>
</ul>
@endif
@endforeach
</div>
</div>
<!-- options -->
@endif
Результаты
AsВы видите, что у меня есть дублированные данные в моем представлении, цвета должны отображаться в одной группе рядом друг с другом, и раскрывающиеся опции также должны стать единым целым.
Кто-нибудь может сказать, где я допустил ошибку?
Обновление
Я добавил mapToGroups
в свой контроллер, теперь результаты стали намного чище, но все же есть проблема с выпадающим списком
Controller
$options = $product->options->mapToGroups(function ($item, $key) {
return [$item->group->title => $item];
});
Blade
@if(count($options)>0)
<!-- options -->
<div class="tt-swatches-container">
@foreach($options as $group => $option)
<div class="tt-wrapper">
<div class="tt-title-options">{{$group}}:</div>
@foreach($option as $opt)
@if($opt->group->type == 'color')
<ul class="tt-options-swatch options-large">
<li><a class="options-color" style="background-color: {{$opt->color}}" href="#"></a></li>
</ul>
@elseif($opt->group->type == 'dropdown')
<form class="form-default">
<div class="form-group">
<select class="form-control">
<option>{{$opt->title}}</option>
</select>
</div>
</form>
@else
<ul class="tt-options-swatch options-large">
<li><a href="#">{{$opt->title}}</a></li>
</ul>
@endif
@endforeach
</div>
@endforeach
</div>
<!-- options -->
@endif
Результат