Define the selected option with the old input in Laravel / Blade

LaravelLaravel 4Blade

Laravel Problem Overview


I have this code:

<select required="required" class="form-control" name="title">
    <option></option>
    @foreach ($titles as $key => $val)
        @if (stristr($key, 'isGroup'))
            <optgroup label="{{ $val }}">
        @else
        <option value="{{ $key }}">{{ $val }}</option>
        @endif
    @endforeach
    </select>

So when the form have errors i use the line Redirect::route('xpto')->withInput()->withErrors($v). But i can't re-populate the select fields. Any way to do this without using JavaScript for example?

Laravel Solutions


Solution 1 - Laravel

Also, you can use the ? operator to avoid having to use @if @else @endif syntax. Change:

@if (Input::old('title') == $key)
      <option value="{{ $key }}" selected>{{ $val }}</option>
@else
      <option value="{{ $key }}">{{ $val }}</option>
@endif

Simply to:

<option value="{{ $key }}" {{ (Input::old("title") == $key ? "selected":"") }}>{{ $val }}</option>

Solution 2 - Laravel

The solution is to compare Input::old() with the $keyvariable using Blade Directives - If Statements.

@if (Input::old('title') == $key)
    <option value="{{ $key }}" selected>{{ $val }}</option>
@else
    <option value="{{ $key }}">{{ $val }}</option>
@endif

Solution 3 - Laravel

Instead of using Input class you can also use old() helper to make this even shorter.

<option {{ old('name') == $key ? "selected" : "" }} value="{{ $value }}">

Solution 4 - Laravel

<select name="gender" class="form-control" id="gender">
                                <option value="">Select Gender</option>
                                <option value="M" @if (old('gender') == "M") {{ 'selected' }} @endif>Male</option>
                                <option value="F" @if (old('gender') == "F") {{ 'selected' }} @endif>Female</option>
                            </select>

Solution 5 - Laravel

After Playing around a bit I came up with this and it seems to work just splendidly

<select name="options[]" id="options" class="form-control" multiple>
    @foreach($settings->includes->get('optionList') as $option)
        <option value="{{ $option->id }}" {{ (collect(old('options'))->contains($option->id)) ? 'selected':'' }}>{{ $option->name }}</option>
    @endforeach
</select>

I may be 100% wrong in leveraging the collect function but it works fine on many of my tests. After seeing a few other posts on the site I saw someone recommend leveraging the in_array($needle, $array) function but after noticing that if my old('options') was null it would error out because it requires in_array requires, bet you guessed an array. So after finding the solution to that albeit ugly solution I played with the collect method because after all we are using larval right! well anyway the ugly solution is as follows

@if (old("options")){{ (in_array($option->id, old("options")) ? "selected":"") }}@endif

inline but man that looks ugly to me so long story short I am using the following instead

{{ (collect(old('options'))->contains($option->id)) ? 'selected':'' }}

Hope this helps others!!

This does not seem to work for a non multiple select field ill get back with one that does work for that though.

Solution 6 - Laravel

I have changed the code to include '' on the title value since without the quotes it fails to work

    <select class="form-control" name="team" id="team">
     <option value="">---------Choose Team---------</option>
           @foreach($teams as $team)
    <option value="{{$team->id}}" {{(old('team')==$team->id)? 'selected':''}}>{{$team->name}}</option>

    @endforeach
    </select>

    eg.<select name="title">
    <option value="1"  {{ old('title') == '1' ? 'selected' : '' }}>
        Item 1
    </option>
    <option value="2" {{ old('title') == '2' ? 'selected' : '' }}>
        Item 2
    </option>
    
    </select>
 

Solution 7 - Laravel

Laravel 6 or above: just use the old() function for instance @if (old('cat')==$cat->id), it will do the rest of the work for you.

How its works: select tag store the selected option value into its name attribute in bellow case if you select any option it will store into cat. At the first time when page loaded there is nothing inside cat, when user chose a option the value of that selected option is stored into cat so when user were redirected old() function pull the previous value from cat.

 {!!Form::open(['action'=>'CategoryController@storecat', 'method'=>'POST']) !!}
        <div class="form-group">
            <select name="cat" id="cat" class="form-control input-lg">
                <option value="">Select App</option>
                @foreach ($cats as $cat)
                    @if (old('cat')==$cat->id)
                        <option value={{$cat->id}} selected>{{ $cat->title }}</option>
                    @else
                        <option value={{$cat->id}} >{{ $cat->title }}</option>
                    @endif
                @endforeach
            </select>
        </div>
        
        <div class="from-group">
            {{Form::label('name','Category name:')}}
            {{Form::text('name','',['class'=>'form-control', 'placeholder'=>'Category name'])}}
        </div>
    <br>
    {!!Form::submit('Submit', ['class'=>'btn btn-primary'])!!}
    {!!Form::close()!!}

Solution 8 - Laravel

<option value="{{ $key }}" {{ Input::old('title') == $key ? 'selected="selected"' : '' }}>{{ $val }}</option>

Solution 9 - Laravel

      <select class="form-control" name="kategori_id">
		<option value="">-- PILIH --</option>
		@foreach($kategori as $id => $nama)
			@if(old('kategori_id', $produk->kategori_id) == $id )
			<option value="{{ $id }}" selected>{{ $nama }}</option>
			@else
			<option value="{{ $id }}">{{ $nama }}</option>
			@endif
		@endforeach
		</select>

Solution 10 - Laravel

this will help you , just compare with old if exist , if not then compare with the default value

<select name="select_name">
    @foreach($options as $key => $text)
       <option {{ ($key == old('select_name',$default))?'selected':'' }}> {{ $text }} </option>
    @endforeach
</select>

the $default is the value that injected from the controller to the view

Solution 11 - Laravel

Short and clean usage example for Laravel 8.59.0 (pre selected edit form with old)

You can use it for your edit page. It comes with the default selection from the database and if you submit an did not pass verification form, the answer is returned by including the old.

<select name="brand_id">
    @foreach ($brands as $brand)
        <option value="{{ $brand->id }}" @if ($product->brand_id === $brand->id || old('brand_id') === $brand->id) selected @endif>{{ $brand->title }}</option>
    @endforeach
</select>

Solution 12 - Laravel

My solution here is to loop, just to avoid duplicate option

                            <select class="form-control" name="status" >
                              <?php $lists = ['Current', 'Win', 'Lose']; ?>

                              @foreach($lists as $list)
                              <option value={{$list}} {{(old('status') == $list?'selected':'')}} >{{$list}}</option>
                              @endforeach
                              
                            </select>

Solution 13 - Laravel

Okay, my 2 cents, using the default value of Laravel's old() function.

<select name="type">
    @foreach($options as $key => $text)
        <option @if((int) old('type', $selectedOption) === $key) selected @endif value="{{ $key }}">{{ $text }}</option>
    @endforeach
</select>

Solution 14 - Laravel

<select style="width: 100%;" name="id_driver" id="id_driver" >
  <option value="" @if (old('id_driver') == "")  selected @endif>Select</option>
  @foreach(\App\Driver::all() as $driver)
    <option value="{{$driver->id}}" @if (old('id_driver') == $driver->id)  
        selected  @endif >(#{{$driver->id}}) {{$driver->business_name}}
    </option>
  @endforeach
</select>

Solution 15 - Laravel

Many answers demonstrating one liners using ternary operators, but I think using @if is more readable, at least for beginners. The following would have sufficed without the else statement.

 <option value="{{ $key }}" @if(old('title')===$key) selected @endif>{{ $val }}</option>

Solution 16 - Laravel

Laravel 9 Checked / Selected / Disabled

<select name="version">
    @foreach ($product->versions as $version)
        <option value="{{ $version }}" @selected(old('version') == $version)>
            {{ $version }}
        </option>
    @endforeach
</select>

Solution 17 - Laravel

<select>
    @if(old('value') =={{$key}})
     <option value="value" selected>{{$value}}</option>
    @else
     <option value="value">{{$value}}</option>
    @endif
</select>

Solution 18 - Laravel

Considering user also want to edit their previous input,

<select name="title">
  @foreach ($titles as $key => $value)
    <option value="{{$value->id}}" {{(old('title', $user->title_id) == $value->id ? 'selected' : '')}} > {{$value->name}} </option>
  @endforeach
</select>

old('title', $user->title_id) returns user saved title_id first time, if validation fails it returns user-selected title_id. Then if it is match with current option id, it is being selected.

Solution 19 - Laravel

Improving CodeToLife's answer with error validation implementation like below

<div class="form-group row">
    <label for="person-field" class="col-md-4 col-form-label text-right">First Person</label>
    <div class="col-md-6">
        <select id="person-field" class="custom-select select2 @error('person') is-invalid @enderror" name="person" required>
            <option></option>
            @foreach(\App\User::all() as $user)
                <option value="{{$user->id}}" @if (old('person') == $user->id) selected  @endif>{{$user->name}}
                </option>
            @endforeach
        </select>
        @error('person')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </div>
</div>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChristopherView Question on Stackoverflow
Solution 1 - LaravelTim LewisView Answer on Stackoverflow
Solution 2 - LaravelChristopherView Answer on Stackoverflow
Solution 3 - Laravel5lessView Answer on Stackoverflow
Solution 4 - LaravelG-RajendraView Answer on Stackoverflow
Solution 5 - LaravelCarlos QuinonesView Answer on Stackoverflow
Solution 6 - Laravelbikash bhandariView Answer on Stackoverflow
Solution 7 - LaravelRafiqView Answer on Stackoverflow
Solution 8 - LaravelAlehView Answer on Stackoverflow
Solution 9 - LaravelRiki krismawanView Answer on Stackoverflow
Solution 10 - Laravelkeroles MonsefView Answer on Stackoverflow
Solution 11 - LaravelumutyerebakmazView Answer on Stackoverflow
Solution 12 - LaravelMarlon BernalView Answer on Stackoverflow
Solution 13 - LaravelMilkmannetjeView Answer on Stackoverflow
Solution 14 - LaravelCodeToLifeView Answer on Stackoverflow
Solution 15 - LaravelAviView Answer on Stackoverflow
Solution 16 - LaravelAkbaraliView Answer on Stackoverflow
Solution 17 - LaravelUnni BhaskarView Answer on Stackoverflow
Solution 18 - LaravelnamalView Answer on Stackoverflow
Solution 19 - LaravelAhmet Firat KelerView Answer on Stackoverflow