我有一家卖衣服的网上商店。每个items
(例如:T恤)都有两个属性colors
和sizes
。我将这三个表组合在一个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关系或其他东西。
答案 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);