2015-01-06 42 views
3

我正在嘗試使用刀片來顯示錶格數據中的下拉列表。我遇到的問題是,我想在表中連接顯示兩個字段的結果,而不僅僅是一個。Laravel /刀片下拉列表 - 對於多個字段

所以我想呈現一些東西像;

<select id="agreement_type" name="agreement_type"> 
    <option value="1">Agreement Field 1 - Agreement Field 2</option> 
    <option value="2">Agreement Field 1 - Agreement Field 2</option> 
    <option value="4">Agreement Field 1 - Agreement Field 2</option> 
</select> 

我的控制器目前看起來像這樣;

$agreements = Agreement::lists('agreement_type','id'); 

return View::make('client_agreements.create') 
     ->with('agreements', $agreements); 

我的刀片視圖目前看起來像這樣;

<div class="form-group"> 
    {{ Form::label('agreement_type', 'Agreement type') }} 
    {{ Form::select('agreement_type', $agreements) }} 
</div> 

我試圖以各種方式修改視圖和控制器以獲得所需的輸出。但不能讓它工作。

我想顯示agreement_typelevel並將id設置爲值,所以我嘗試了;

$agreements = Agreement::lists('agreement_type'.'level','id'); 

但是,這只是顯示level的價值和完全忽略id

回答

3

這是最簡單的方法。只需使用一個foreach循環建立的選項數組:

$agreements = Agreement::all(); 
$agreementOptions = array(); 
foreach($agreements as $agreement){ 
    $agreementOptions[$agreement->id] = $agreement->agreement_type.' '.$agreement->level; 
} 
return View::make('client_agreements.create') 
      ->with('agreements', $agreementOptions); 

然而,你也可以定義在模型中的attribute accessor。你可以用它來創建可訪問的正常新的屬性,但你可以運行邏輯生成它們(如合併到屬性)

public function getSelectOptionAttribute(){ 
    return $this->attributes['agreement_type'].' '.$this->attributes['level']; 
} 

然後你就可以使用lists

$agreements = Agreement::all()->lists('select_option', 'id'); 

( Laravel將SelectOption(studly case)從方法名稱轉換爲select_option(snake case)作爲屬性,所以不要因此而感到困惑)

+0

我無法獲得屬性存取器的工作。 'select_option不存在'。我的Laravel版本並不舊,只有一個月左右。你的第一個建議運行良好,所以我現在就去做。謝謝 – mikelovelyuk

+0

當直接使用'lists'時,它只能用於數據庫字段,因爲它使用SQL來完成。儘管只是先調用all(),你仍然可以使用它。 (就像在我更新的答案中) – lukasgeiter