2014-09-24 72 views
0

我在我的laravel應用程序中有兩個關聯模型表:subsectorssectors。這是一個例子。Laravel從連接表創建嵌套選擇框

界別分組:

|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; 
    } 
} 

回答

0

使用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); 
    } 
); 
-2

我不建議在Controller中編寫複雜的數組,而是直接編寫HTML標記

<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> 
+0

爲什麼這是個好主意?它會導致更多的靜態代碼,並且不支持模型表單填充,並且不會消除嵌套for循環的需要。 – harryg 2014-09-24 10:49:08