显示产品变体

时间:2016-10-02 05:51:07

标签: laravel database-design eloquent

我有一家卖衣服的网上商店。每个items(例如:T恤)都有两个属性colorssizes。我将这三个表组合在一个variants表中,具有以下结构:

- item_id
- color_id
- size_id
- price
- stock

这是有效的,我在hasMany()items之间使用variants关系(一个项目有很多变种),然后是belongsTo()之间的关系每种变体和颜色/尺寸(每种变体属于一种颜色和尺寸)。

这是我用来获取所有项目的代码:

$items = Item::with(['variants', 'variants.color', 'variants.size'])->get();

以下是返回数据的示例:http://pastebin.com/CjsYp6wS

我遇到的问题是显示这些数据。我想在表格中显示每个项目,并且每个项目都有两个选择框:一个显示所有颜色,一个显示所有尺寸。然后,用户可以选择颜色和尺寸,并查看此变体的更新价格。

然而,由于我的关系设置方式,如果我想显示所有颜色和所有尺寸,我必须做这样的事情:

<select name="color">
    @foreach($item->variants as $variant)
    <option value="{{ $variant->color->id }}">{{ $variant->color->name }}</option>
    @endforeach
</select>

这远非理想,因为如果它们恰好是两种或更多种变体,它会导致每种颜色和尺寸的重复值。

有更好的方法吗?我认为必须有一种更简单的方法,使用不同的数据库结构或Eloquent关系或其他东西。

2 个答案:

答案 0 :(得分:0)

您可以将显示的所有值存储在一个数组中,并检查是否已显示该值,如果已显示该值,则可以跳过该值。在这种情况下,您的代码应如下所示:

<select name="color">
    <?php $color_array=[]; ?>
    @foreach($item->variants as $variant)
        @if(!in_array($variant->color->id,$color_array)
            <option value="{{ $variant->color->id }}">{{ $variant->color->name }}</option>
            <?php array_push($color_array,$variant->color->id); ?>
        @endif
    @endforeach
</select>

这将使其检查输入的值是否已在数组中输入,然后再显示它。如果没有输入,那么它将显示它并将其添加到数组中,否则它将不会执行任何操作并跳到下一个条目。您也可以对大小或任何其他属性执行相同操作。希望这会有所帮助。

答案 1 :(得分:0)

选择项目,获取item_id:

$items=Item::all();
<select name="iem">
    @foreach($items as $item)
    <option value="{{ $item->id }}">{{ $item->name }}</option>
    @endforeach
</select>

选择颜色,获取color_id:

$colors=Color::all();
<select name="color">
    @foreach($colors as $color)
    <option value="{{ $color->id }}">{{ $color->name }}</option>
    @endforeach
</select>

选择尺寸,获取size_id:

$sizes=Size::all();
<select name="color">
    @foreach($sizes as $size)
    <option value="{{ $size->id }}">{{ $size->name }}</option>
    @endforeach
</select>
从变种表中获取该item_id,color_id和size_id的

获取价格

$variant=Variant::where[('item_id'=>$item_id)]->where[('size_id'=>$size_id)]->where[('size_id'=>$size_id)]->first();
print_r($variant->price);