簡體   English   中英

Laravel從聯接表創建嵌套選擇框

[英]Laravel create nested select box from joined tables

我有我的laravel應用程序相關的模型兩個表: subsectorssectors 這是一個例子。

子行業:

|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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM