我正在尝试填充Laravel中的select
下拉列表以显示产品的属性。
<select>
@foreach($attributes as $key=>$attr)
<optgroup label="{{$attr->name}}">
<option value="{{$attr->value}}">{{$attr->value}}</option>
</optgroup>
@endforeach
</select>
当用户存储属性的数据时,他可以存储Color: Red with id=1
和Color: Blue with id=2
。
用于获取数据的查询是:
$attributes = Attribute::orderBy('name', 'ASC')->get();
虽然,我需要根据他们的名字找到类似的记录,比如Color
。 select
下拉列表应在$attr->name
列出<optgroup label>
一次,$attr->value
中应重复<option value>
。
我尝试更改查询并使用groupBy
,但这不会按预期工作。查询将仅返回忽略其余记录的任何记录的第一个实例。
$attributes = Attribute::orderBy('name', 'ASC')->groupBy('name')->get();
我该如何解决这个问题?提前谢谢。
答案 0 :(得分:3)
我会将所有属性放入一个多维数组中,然后迭代生成选择。
// Fetch all attributes
$results = Attribute::orderBy('name', 'ASC')->get();
$attributes = array();
/**
* Group results into a multidimensional array like:
* [color]
* [red]
* [white]
* [shape]
* [circle]
* [square]
*/
foreach ( $results as $v ) {
if ( !isset($attributes[$v->name]) ) {
$attributes[$v->name] = array();
}
$attributes[$v->name][$v->value] = $v->value;
}
// Spit out the select/option groups
?>
<select>
@foreach ( $attributes as $key => $attr )
<optgroup label="{{$key}}">
@foreach ( $attr as $values )
<option value="{{$value}}">{{$value}}</option>
@endforeach
</optgroup>
@endforeach
</select>