mikelovelyuk
mikelovelyuk

Reputation: 4152

Laravel/Blade Drop Down List - For more than one field

I'm trying to use blade to display a dropdown list from table data. The problem I have, is that I want to display the results of two fields in the table concatenated, not just one.

So I want something to render something like;

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

My controller currently looks like this;

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

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

My blade view currently looks like this;

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

I have tried to amend the view and controller in various ways to get the desired output. But can't get it to work.

I want to display agreement_type and level and have the id set as the value so I tried;

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

But this just displays level as the value and completely ignores id.

Upvotes: 3

Views: 2360

Answers (1)

lukasgeiter
lukasgeiter

Reputation: 152860

This is the simplest method. Just use a foreach loop to build the options array:

$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);

However you can also define an attribute accessor in your model. You can use that to create new properties that can be accessed normal, but you can run logic to generate them (like combining to attributes)

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

And then you can use lists:

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

(Laravel converts SelectOption (studly case) from the method name to select_option (snake case) for the attribute, so don't get confused by that)

Upvotes: 3

Related Questions