[英]Laravel create nested select box from joined tables
我有我的laravel应用程序相关的模型两个表: subsectors
和sectors
。 这是一个例子。
子行业:
|id | name |sector_id|
|---|---------------|---------|
| 1 | Global Equity | 1 |
| 2 | US Equity | 1 |
| 3 | UK Equity | 1 |
| 4 | Govt Bonds | 2 |
| 5 | IG Bonds | 2 |
| 6 | HY Bonds | 2 |
| 7 | Gold | 3 |
部门:
| id | name |
|----|-------------|
| 1 | Equity |
| 2 | Bonds |
| 3 | Commodities |
因此,每个子部门都映射到一个部门。 这反映在我的模型类中。
我想为子部门创建一个选择框,其中选项组的扇区名称为选项组名称,子部门为选项。 对于Laravel的表单生成器,我相信使用以下语法:
{{ Form::select('subsector', array(
'Equity' => [1 => 'Global Equity', 2 => 'US Equity', 3 => 'UK Equity'],
'Bonds' => [4 => 'Govt Bonds', 5 => 'IG Bonds', 6 => 'HY Bonds'],
//etc...
))}}
我的问题是编写雄辩的或流利的查询以生成上面的嵌套数组,以将其传递给formbuilder。 我想我可以通过遍历一个Eloquent查询结果对象来做到这一点,但是我想知道是否有更好的方法来获得2个联接表的简单嵌套结果。
我所有的关系都在模型中定义。
编辑
此方法有效,但我希望找到一种更干净的方法,而不会嵌套for
循环。
$subsectors = [];
$sectors = Sector::with('subsector')->get();
foreach ($sectors as $sector)
{
$subsectors[$sector->name] = [];
foreach ($sector->subsector as $subsector)
{
$subsectors[$sector->name][$subsector->id] = $subsector->name;
}
}
使用Form::macro
以便您可以执行此操作(我假设为子subsectors
关系,因为hasMany
更准确):
$sectors = Sector::with('subsectors')->get();
Form::groupSelect('subsector', $sectors, 'subsectors')
这是您需要的宏:
Form::macro(
'groupSelect',
function ($name, $collection, $relation, $groupName = 'name', $optName = 'name', $optValue = 'id', $selected = null, $attributes = [])
{
$groups = [];
foreach ($collection as $model)
{
$groups[$model->$groupName] = $model->$relation->lists($optName, $optValue);
}
return Form::select($name, $groups, $selected, $attributes);
}
);
建议您在视图中直接编写HTML标签,而不是在Controller中创建复杂的数组
<select name="subsector">
@foreach(Sector::with('subsector')->get() as $sector)
<optgroup label="{{ $sector->name }}">
@foreach($sector->subsector as $subsector)
<option value="{{ $subsector->id }}">{{{ $subsector->name }}}</option>
@endforeach
@endforeach
</select>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.