Laravel关系问题

时间:2019-02-01 01:37:11

标签: php laravel model laravel-blade

我无法让产品选项显示在单独的字段中而不是被分组。

逻辑

  1. 选项组获取类型和值
  2. 选项也属于产品组
  3. 产品获得选择权

模型

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

结果

one

如您所见,我的视图中有重复的数据,颜色必须在一组中彼此相邻显示,并且下拉选项也必须成为一种。

任何人都可以告诉我我在哪里做错了吗?

更新

我在控制器中添加了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

结果

two

1 个答案:

答案 0 :(得分:1)

您的迭代非常错误。您正在做的是为每种颜色创建一个完整的ul,为每个下拉列表创建一个完整的选择,以及为每个色板创建一个完整的ul。

最简单的方法是使用Blade神奇的stacks;我们只是将每个选项推入自己的堆栈(颜色,下拉列表,色板),最后打印堆栈:

Compile with .Net Native tool chain

祝你好运。